#python #python-3.x #unicode #escaping #unicode-escapes
#python #python-3.x #юникод #экранирование #юникод-экранирование
Вопрос:
У меня есть текстовый файл, который заполнен символами Юникода, "ud83dudca5"
но python, похоже, они не нравятся.
Но если я заменю его на u'U0001f4a5'
, который, похоже, является его стилем побега python (Charbase), это сработает.
Есть ли решение для преобразования их всех в формат u"Uxxxxxxxx"
escape, который может понять python?
Спасибо.
Комментарии:
1. Это потому, что это UTF-16, а не UTF-8.
2. @Joey: Это не (весь) смысл. Существует фундаментальное различие между объектом Unicode и закодированной последовательностью байтов (закодированной UTF-16, UTF-8 или любой другой).
3. Да, я так думаю, но у меня есть символы UTF-16 в файле UTF-8. В этом проблема.
4. @TimPietzcker: Мой комментарий касался в основном «У меня есть этот материал в файле UTF-8, и он не работает должным образом»
5. Вы имеете в виду, что у вас есть файл с буквенной обратной косой чертой и буквой «u»? Если это так, вам нужно определить, какой это формат, и использовать для этого подходящий анализатор. например, это может быть JSON.
Ответ №1:
Вы смешиваете Unicode и закодированные строки. u'U0001f4a5'
это объект Unicode, внутренний тип данных Python для обработки строк. (В Python 3 u
это необязательно, поскольку теперь все строки являются объектами Unicode).
Файлы, с другой стороны, используют кодировки. UTF-8 является наиболее распространенным, но это всего лишь один из способов хранения объекта Unicode в байт-ориентированном файле или потоке. При открытии такого файла необходимо указать кодировку, чтобы Python мог преобразовать байты в значимые объекты Unicode.
В вашем случае, похоже, вам нужно открыть файл, используя UTF-16
кодек вместо UTF-8
.
with open("myfile.txt", encoding="utf-16") as f:
s = f.read()
даст вам правильное содержимое, если кодек на самом деле UTF-16
. Если это выглядит неправильно, попробуйте "utf-16-le"
или "utf-16-be"
.
Комментарии:
1. Ну, я пытался, но когда я открываю файл с
utf-16
помощью, у меня есть:UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 9526-9527: illegal UTF-16 surrogate
. То жеutf-16-be
самое, я могу открыть его сutf-8
помощью, но с проблемой uxxxx uxxxx.2. Тогда он использует совершенно другую кодировку. К сожалению, нет способа надежно определить эту кодировку — вам нужно проверить источник файла. Можете ли вы опубликовать соответствующий образец файла?