Проблема с неэкранированными строками Юникода - PullRequest
0 голосов
/ 10 марта 2011

У меня проблема с неэкранированной строкой Unicode. Я попробовал следующее, но оно не работает с символами Юникода.

>>> s = ur"\'test\'"
>>> s.decode("string_escape")
"'test'"
>>> s = ur"\'test \u2014\'"
>>> s.decode("string_escape")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 7:
ordinal not in range(128)

Есть ли лучший способ удалить обратную косую черту?

Кстати: мне это нужно, потому что xmlrpclib.ServerProxy экранирует ответы.

Редактировать: Вот пример для моего запроса xmlrpc:

>>import xmlrpclib
>>server = xmlrpclib.ServerProxy("http://ws.audioscrobbler.com/2.0/")
>>xml_data = server.tag.search({'api_key':'...','tag':'80s'})
>>print xml_data
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<lfm status=\"ok\">
<results for=\"80s\" xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\">
<opensearch:Query role=\"request\" searchTerms=\"80s\" startPage=\"1\" />
...

Я думаю, что побег происходит с сервера xmlrpc.

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Во-первых, есть "string_escape" и "unicode_escape", либо они не могут декодировать заданную вами строку. Первый читает строку байтов, экранированную как строку байтов, и декодирует ее как строку байтов. Вторая читает строку Unicode, экранированную и сохраненную в байтовой строке, поэтому она не может прочитать входные объекты Unicode, по крайней мере те, которые содержат символы Unicode в них.

Я считаю, что приведенная здесь необработанная строка неверна, и вы действительно хотите s.decode('unicode_escape') для реальных строк, исходящих из вашего источника.

Если я ошибаюсь, лучшее, что вы можете сделать, это вручную экранировать любые неэкранированные одинарные кавычки с помощью re, поместить дополнительные одинарные кавычки вокруг него и использовать ast.literal_eval.

def substitute(match):
    if len(match.group(1)) % 2 == 1:
        return match.group()
    else:
        return ur"%s\%s" % (match.group(1), match.group(2))

ast.literal_eval("'%s'" % re.sub(ur"(\\+)(')", substitute, s))

Третий вариант - передать строку на ast.literal_eval без дополнительной работы с вашей стороны. Какой из этих трех параметров зависит от того, что именно у вас есть в виде строки.

У меня есть еще одно подозрение, что это может быть объект JSON. Вы должны привести пример строки, которую вы получаете, и откуда вы ее получаете и как.

0 голосов
/ 10 марта 2011

Интересно, что опубликованная вами ошибка не возникает при использовании Python 2.6.4:

In [110]: s = ur"\'test\'"

In [111]: s.decode("string_escape")
Out[111]: "'test'"

In [112]: s = ur"\'test \u2014\'"

In [113]: s.decode("string_escape")
Out[113]: "'test \xe2\x80\x94'"

In [114]: print(s.decode("string_escape"))
'test —'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...