2013-06-19 7 views
3

Я хочу кодировать строку в UTF-8 и просматривать соответствующие байты UTF-8 отдельно. В Python РЕПЛ следующее, кажется, работает нормально:Преобразование строки Юникода в UTF-8, а затем в JSON

>>> unicode('©', 'utf-8').encode('utf-8') 
'\xc2\xa9' 

Обратите внимание, что я использую U+00A9 COPYRIGHT SIGN в качестве примера здесь. '\xC2\xA9' близок к тому, что я хочу - строка, состоящая из двух отдельных кодовых точек: U + 00C2 и U + 00A9. (Когда UTF-8-декодирован, он возвращает исходную строку, '\xA9'.)

Затем я хочу, чтобы строка с кодировкой UTF-8 была преобразована в JSON-совместимую строку. Однако, следующее, кажется, не делать то, что я хочу:

>>> import json; json.dumps('\xc2\xa9') 
'"\\u00a9"' 

Обратите внимание, что он генерирует строку, содержащую U + 00A9 (оригинальный символ). Вместо этого мне нужна строка с кодировкой UTF-8, которая будет выглядеть как "\u00C2\u00A9" в действительном JSON.

TL; DR Как я могу превратить '©' в "\u00C2\u00A9" в Python? Я чувствую, что мне не хватает чего-то очевидного - нет ли встроенного способа сделать это?

+0

** Примечание: ** [Результаты использования 'print' в REPL Python зависят от переменной среды' $ LANG'.] (Http://stackoverflow.com/a/3221297/96656). Это вводит дополнительный слой путаницы при тестировании таких вещей. –

+0

utf8 - unicode. –

+0

Это утверждение неверно на многих уровнях. UTF-8 является кодировкой. Юникод больше похож на базу данных, которая отображает числа (кодовые точки) на символы. Эти числа затем используются кодировками, такими как UTF-8. Это правда, что в отличие от множества других кодировок UTF-8 способен кодировать/декодировать любой символ Unicode, но это не означает UTF-8 _is_ Unicode. –

ответ

2

Если вы действительно хотите получить "\u00c2\u00a9", введите json строку Unicode в качестве входных данных.

>>> print json.dumps(u'\xc2\xa9') 
"\u00c2\u00a9" 

Вы можете создать эту строку Unicode из необработанных байтов:

s = unicode('©', 'utf-8').encode('utf-8') 
s2 = u''.join(unichr(ord(c)) for c in s) 

Я думаю, что вы действительно хотите "\xc2\xa9" как выход, но я не уверен, как произвести это еще.

+0

Я хочу иметь 'u '\ u00A9'' в качестве входных данных (так, как в первом примере), и' '" \ u00c2 \ u00a9 "'' как вывод. –

+0

Более короткий способ сделать это выглядит как 'json.dumps (unicodeString.encode ('utf8'). Decode ('latin1')). –

+0

@MathiasBynens, я думаю, что первые 256 кодов Unicode соответствуют именно «latin1», поэтому ваша короткая версия будет правильной. Очень умно. –

Смежные вопросы