2015-09-15 2 views
1

Я загружаю файл с кучей символов Юникода (например, \xe9\x87\x8b). Я хочу преобразовать эти символы в свою форму escaped-unicode (\u91cb) в Python. Я нашел пару подобных вопросов здесь, в StackOverflow, включая этот Evaluate UTF-8 literal escape sequences in a string in Python3, который делает почти то, что я хочу, но я не могу решить, как сохранить данные.Как преобразовать unicode в unicode-escaped текст

Например: входного файла:

\xe9\x87\x8b

Python Script

file = open("input.txt", "r") 
text = file.read() 
file.close() 
encoded = text.encode().decode('unicode-escape').encode('latin1').decode('utf-8') 
file = open("output.txt", "w") 
file.write(encoded) # fails with a unicode exception 
file.close() 

Output File (То, что я хотел):

\u91cb

+0

Что такое 'print (open ('input.txt', 'rb'). Read())'? Это 'b '\ xe9 \ x87 \ x8b'' или' b' \\ xe9 \\ x87 \\ x8b''? – jfs

ответ

2

Вам нужно шифровать он снова с кодировкой unicode-escape.

>>> br'\xe9\x87\x8b'.decode('unicode-escape').encode('latin1').decode('utf-8') 
'釋' 
>>> _.encode('unicode-escape') 
b'\\u91cb' 

Измененный код (используется бинарный режим для уменьшения ненужного кодирования/декодирования)

with open("input.txt", "rb") as f: 
    text = f.read().rstrip() # rstrip to remove trailing spaces 
decoded = text.decode('unicode-escape').encode('latin1').decode('utf-8') 
with open("output.txt", "wb") as f: 
    f.write(decoded.encode('unicode-escape')) 

http://asciinema.org/a/797ruy4u5gd1vsv8pplzlb6kq

+0

Удивительный, работает как шарм. – fallaciousreasoning

0

Это выглядит так, как если ваш входной файл UTF-8 кодируются так указать UTF -8 при открытии файла (предполагается, что Python3 соответствует вашей ссылке):

with open("input.txt", "r", encoding='utf8') as f: 
    text = f.read() 

text будет содержать содержимое файла как str (т. строка unicode). Теперь вы можете записать его в юникод спасся форму непосредственно в файл, указав encoding='unicode-escape':

with open('output.txt', 'w', encoding='unicode-escape') as f: 
    f.write(text) 

Содержание файла теперь будет содержать Юникода маскирование литералов:

$ cat output.txt 
\u91cb 
0

\xe9\x87\x8b не символ Unicode , Это выглядит как представление байтовой строки, которая представляет Юникод-символ, кодированный с использованием кодировки символов utf-8. \u91cb представляет собой представление из символов в исходном коде Python (или в формате JSON). Не путайте текстовое представление и сам характер:

>>> b"\xe9\x87\x8b".decode('utf-8') 
u'\u91cb' # repr() 
>>> print(b"\xe9\x87\x8b".decode('utf-8')) 
釋 
>>> import unicodedata 
>>> unicodedata.name(b"\xe9\x87\x8b".decode('utf-8')) 
'CJK UNIFIED IDEOGRAPH-91CB' 

читать текст, закодированный в UTF-8 из файла, указать кодировку явно:

with open('input.txt', encoding='utf-8') as file: 
    unicode_text = file.read() 

Это точно так же для сохранения текста Unicode в файл:

with open('output.txt', 'w', encoding='utf-8') as file: 
    file.write(unicode_text) 

Если опустить явное encoding параметр, то используется locale.getpreferredencoding(False), который может производить кракозябры, если он делает п ot соответствуют фактической кодировке символов, используемой для сохранения файла.

Если ваш входной файл буквально содержит \xe9 (4 символа), тогда вы должны исправить любое программное обеспечение, генерирующее его. Если вам нужно использовать 'unicode-escape'; что-то сломано.

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