Можно ли напечатать «é» как «% C3% A9» в Python?

У меня проблема с передачей uri с символами Юникода в rdflib для добавления в Graph()

Так, например, я хочу запустить:

from rdflib import Graph
g = Graph()
uri = 'http://dbpedia.org/resource/René_Auberjonois'
g.parse(uri)

Но я получаю ошибку кодирования кодека ascii, которая так распространена в Python.

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 17: ordinal not in range(128)

Если uri был передан как `http://dbpedia.org/resource/Ren%C3%A9_Auberjonois', было бы хорошо, парсер работает, если бы строка была в таком виде (извините, я не знаю, как назвать вещи, будь то "сырые", "экранированные", "неэкранированные" или как-то иначе) .

могу ли я что-нибудь сделать с uri (он не устанавливается таким образом, он устанавливается через функцию, перебирающую список имен), чтобы print uri давал http://dbpedia.org/resource/Ren%C3%A9_Auberjonois?

предыстория: изначально я задал этот вопрос, но добавил u в перед строкой либо невозможно с тем, как настроен сценарий (я не устанавливаю каждую строку, например: s = 'René_Auberjonois'), либо фактически не работает в конце, когда я передаю ее в rdflib (т.е. все еще получаю ошибку кодирования, потому что она проходит http://dbpedia.org/resource/René_Auberjonois)

Кроме того, если есть хорошие ресурсы для понимания проблемы, с которой я здесь сталкиваюсь, это было бы здорово. На данный момент меня смущает кодировка символов.


person roy    schedule 28.04.2014    source источник
comment
Почему вы не используете литерал unicode?   -  person Ignacio Vazquez-Abrams    schedule 28.04.2014
comment
Потому что я плохо разбираюсь в этой теме и не уверен, какую пользу это принесет мне или что именно это повлечет за собой (т.е. я не профессионал)   -  person roy    schedule 28.04.2014
comment
Но вы хотя бы читаете ответы на другие свои вопросы, верно?   -  person Ignacio Vazquez-Abrams    schedule 28.04.2014
comment
да, и я ценю вашу помощь, но даже воспользовавшись этим советом, я обнаружил, что у меня все та же проблема.   -  person roy    schedule 28.04.2014


Ответы (1)


Если вам нужна форма с процентным кодированием, вы можете использовать urllib:

>>> import urllib
>>> s='http://dbpedia.org/René_Auberjonois'
>>> urllib.quote(s)
'http%3A//dbpedia.org/Ren%C3%A9_Auberjonois'
>>> urllib.quote(s, safe=':')
'http:%2F%2Fdbpedia.org%2FRen%C3%A9_Auberjonois'
>>> urllib.quote(s, safe=':/')
'http://dbpedia.org/Ren%C3%A9_Auberjonois'
>>> 

Используйте параметр safe, чтобы указать символы, которые не следует заключать в кавычки. По умолчанию это /.

person devnull    schedule 28.04.2014