Преобразование строки Unicode в UTF-8 - PullRequest
0 голосов
/ 24 апреля 2018

Во-первых, я знаю, что в Python 2.x существует множество вопросов, касающихся en / de-кодирования строк, но я не могу найти решение этой проблемы.

У меня естьстрока в кодировке Unicode, которая содержит букву č, которая представлена ​​как \u00c4\u008d

Если в консоли Python я пишу

>>> a = u"\u00c4\u008d"
>>> print a

, вместо č выводятся два странных символаВозможно, потому что фактическая кодировка этой строки должна быть UTF-8.Поэтому я пытаюсь использовать .decode("utf-8"), но для этого я получаю стандарт UnicodeEncodeError.

Знаете ли вы, как я могу заставить Python печатать эту строку как č в консоли?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

č не представлено u'\u00c4\u008d'.Эти два шестнадцатеричных значения являются значениями в кодировке UTF-8, поэтому должны быть записаны в байтовой строке как '\xc4\x8d'.Пример:

>>> s = '\xc4\x8d'
>>> s.decode('utf8')
u'\u010d'
>>> print(s.decode('utf8'))
č

Предупреждение: Ваш терминал должен быть настроен на кодировку, которая поддерживает символ для правильной печати, или вы увидите UnicodeEncodeError.

Если по какой-либо причине у вас естьнеправильно декодированная строка Unicode, вы можете воспользоваться тем, что первые 256 кодовых точек Unicode соответствуют кодировке latin1 и исправить это:

>>> s = u'\u00c4\u008d'
>>> s.encode('latin1')
'\xc4\x8d'
>>> s.encode('latin1').decode('utf8')
u'\u010d'
>>> print(s.encode('latin1').decode('utf8'))
č

Если у вас неправильно декодирован Unicodeстрока, вы должны показать файл, который у вас есть, или код, который его читает, и решить эту проблему.

0 голосов
/ 24 апреля 2018

Поработав с python более часа, я решил поискать решение на другом языке.Вот как моя цель может быть достигнута в C #:

var s = "\u00c4\u008d";
var newS = Encoding.UTF8.GetString(Encoding.Default.GetBytes(s));
File.WriteAllText(@"D:\tmp\test.txt", newS, Encoding.UTF8);

Наконец-то!Файл теперь содержит č.

. Поэтому я был вдохновлен этим подходом в C # и сумел найти следующее (на первый взгляд) эквивалентное решение в Python:

>>> s = u"\u00c4\u008d"
>>> arr = bytearray(map(ord, s))
>>> print arr.decode("utf-8")
č

I 'Я не уверен, насколько хорошо это решение, но, похоже, оно работает в моем случае.

...