Как преобразовать » uxxxx uxxxx» в u ‘ Uxxxxxxxx’?

#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. Тогда он использует совершенно другую кодировку. К сожалению, нет способа надежно определить эту кодировку — вам нужно проверить источник файла. Можете ли вы опубликовать соответствующий образец файла?