Вопрос по string, utf-8, text, python, encoding – Интерпретировать «простой текст» как текст utf-8 в python

0

У меня есть текстовый файл с текстом, который должен был быть интерпретирован как utf-8, но не был (он был дан мне таким образом). Вот пример типичной строки файла:

\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f

который должен был быть:

ロンドン在住

Теперь я могу сделать это вручную на python, набрав в командной строке следующее:

>>> h1 = u'\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f'    
>>> print h1
ロンドン在住

что дает мне то, что я хочу. Есть ли способ, которым я могу сделать это автоматически? Я пытался делать подобные вещи

>>> f = codecs.open('testfile.txt', encoding='utf-8')
>>> h = f.next()
>>> print h
\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f

Я также пытался использовать «закодировать» и «декодировать»; функции, есть идеи?

Спасибо!

Нет такого понятия, как простой текст, и на самом деле не существует такого понятия, как текст UTF-8. Текст это абстракция. UTF-8 - это кодировка символов в байты. Кроме того, если файл фактически содержит обратную косую черту, он полностью отличается от размещения обратной косой черты между двойными кавычками в исходном файле Python. Это совершенно отдельный этап кодирования. Если вы хотите & # x30ED; в вашем файле, затем поместите & # x30ED; в вашем файле. Karl Knechtel

Ваш Ответ

1   ответ
3

\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f не является UTF8; он использует escape-формат Python Unicode. Использоватьunicode_escape вместо кодека:

>>> print '\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f'.ロンドン在住

Вот для сравнения приведенная выше кодировка UTF-8:

>>> '\u30ed\u30f3\u30c9\u30f3\u5728\u4f4f'..encode('utf-8')
'\xe3\x83\xad\xe3\x83\xb3\xe3\x83\x89\xe3\x83\xb3\xe5\x9c\xa8\xe4\xbd\x8f'

Обратите внимание, что данные, декодированные сunicode_escape обрабатываются как Latin-1 для всего, что не является распознанной escape-последовательностью Python.

Будьте осторожны, однако; может быть, вы действительно смотрите наJSON-encoded data, который использует ту же нотацию для указания экранирования символов. использованиеjson.loads() декодировать фактические данные JSON; Строки JSON с такими экранированными символами разграничиваются" кавычки и обычно являются частью более крупных структур (таких как списки JSON или объекты).

Это объясняет мою путаницу / разочарование, большое спасибо! user1464209

Похожие вопросы