как преобразовать u'' в unicode в python

Я пытаюсь декодировать u'' в python, поэтому я могу распечатать его без предупреждений об ошибках. Другими словами, мне нужно преобразовать глупые символы Microsoft Windows 1252 в настоящий юникод.

Источник html, содержащий необычные ошибки, взят отсюда http://members.lovingfromadistance.com/showthread.php?12338-HAVING-SECOND-THOUGHTS

Прочитайте о u'' и u'', нажав здесь http://www.fileformat.info/info/unicode/char/f04a/index.htm

один пример выглядит так:

"Oh god please some advice ":

Out[408]: Господи, пожалуйста, совет '

Дан такой поток в качестве примера для теста:

thread = u'who are you \uf04a Why you are so harsh to her \uf04c'
thread.decode('utf8')

print u'\uf04a'
print u'\uf04a'.decode('utf8') # error!!!

Кодек 'charmap' не может кодировать символ u'' в позиции 1526: сопоставление символов с неопределенным

С помощью двух сценариев Python я успешно преобразовал u'\x92', но я все еще застрял с u''. Какие-либо предложения?

Ссылки

https://github.com/AnthonyBRoberts/NNS/blob/master/tools/killgremlins.py

Обработка нестандартного американского английского Символы и символы в CSV с использованием Python

Решение:

Согласно комментариям ниже: я заменяю этот набор символов знаком вопроса ('?')

thread = u'who are you \uf04a Why you are so harsh to her \uf04c'
thread = thread.replace(u'\uf04a', '?')
thread = thread.replace(u'\uf04c', '?')

Надеюсь, это поможет другим новичкам.


person Frank Wang    schedule 01.06.2014    source источник
comment
Не совсем понятно, что вы пытаетесь сделать или где появляется Windows 1252. Какой символ вы действительно пытаетесь напечатать? Откуда вы берете данные? Если эту строку следует воспринимать как последовательность байтов, то она недействительна в UTF-8...   -  person Jon Skeet    schedule 01.06.2014
comment
Я согласен. Сообщение выше было исправлено.   -  person Frank Wang    schedule 02.06.2014


Ответы (2)


u'\uf04a'

уже является объектом Unicode, что означает, что декодировать нечего. Единственное, что вы можете с ним сделать, это закодировать его, если вы ориентируетесь на определенную кодировку файла, такую ​​как UTF-8 (которая не совпадает с Unicode, но постоянно с этим путаюсь).

u'\uf04a'.encode("utf-8")

дает вам строку (Python 2) или объект bytes (Python 3), который вы затем можете записать в файл или терминал UTF-8 и т. д.

Вы не сможете закодировать его как обычную строку Windows, потому что cp1252 не имеет этого символа.

Что вы можете сделать, так это преобразовать его в кодировку, в которой нет этих оскорбительных символов, указав кодировщику заменить отсутствующие символы на ?:

>>> u'who\uf04a why\uf04c'.encode("ascii", errors="replace")
'who? why?'
person Tim Pietzcker    schedule 01.06.2014
comment
Мне нужно преобразовать его в осмысленный юникод, а не в его текущую форму. - person Frank Wang; 01.06.2014
comment
пожалуйста, определите, что вы считаете значимым. Может быть, было бы также полезно, если бы вы рассказали нам, в чем ваша настоящая проблема, то есть, что именно вы пытаетесь сделать? откуда берутся ваши данные и что вам нужно с ними делать? - person mata; 01.06.2014
comment
>>> print u'\uf04a'.encode("utf-8") дает ∩üè с Python 2 в моей системе Win-7. - person martineau; 01.06.2014
comment
@martineau - если вы записываете двоичные данные в кодировке utf8 на терминал, который не поддерживает utf8, вы получите мусор, поэтому ваша команда на самом деле не имеет смысла. - person mata; 01.06.2014
comment
В моем случае, чтобы преобразовать его в ? это правильный путь. - person Frank Wang; 02.06.2014
comment
@FrankWANG: Это просто (и лучше, чем решение, которое вы предложили в своем вопросе (где решения в любом случае не подходят :)). Смотрите мою правку. - person Tim Pietzcker; 02.06.2014

Обозначение u'\uf04a' обозначает кодовую точку Unicode U+F04A, которая по определению является кодовой точкой для частного использования. Это означает, что стандарт Unicode не присваивает ему никаких символов и никогда не присваивает; вместо этого его можно использовать по частным соглашениям.

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

Возможно, что U+F04A является результатом ошибочной обработки (например, неправильного преобразования) символьных данных на каком-то более раннем этапе.

person Jukka K. Korpela    schedule 01.06.2014