Как преобразовать строку Unicode (содержащую дополнительные символы, такие как £ $ и т. Д.) В строку Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Как преобразовать строку Unicode (содержащую дополнительные символы, такие как £ $ и т. Д.) В строку Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Ответы:
Видеть unicodedata.normalize
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'
unicodeстроку в a str- это удалить или преобразовать символы, которые не могут быть представлены в ASCII. Так что +1 от меня.
type(title) == unicode and type(title.encode('utf-8')) == str, Нет необходимости повреждать ввод, чтобы получить строку байтов, которую можно сохранить в файл.
Вы можете использовать кодирование в ASCII, если вам не нужно переводить не-ASCII символы:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
ignoreпротивreplace
a.encode('ascii', 'xmlcharrefreplace')дает 'aaaàçççñññ'.
type(a)находится strв Python 3.6.8 и не имеет никакого encode()метода.
>>> text=u'abcd'
>>> str(text)
'abcd'
Если строка содержит только символы ascii.
Если у вас есть строка Unicode, и вы хотите записать ее в файл или другую сериализованную форму, вы должны сначала закодировать ее в определенное представление, которое можно сохранить. Существует несколько распространенных кодировок Unicode, таких как UTF-16 (для большинства символов Unicode используется два байта) или UTF-8 (1-4 байта / кодовая точка в зависимости от символа) и т. Д. Чтобы преобразовать эту строку в определенную кодировку, необходимо выполнить следующие действия. можешь использовать:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
Эта необработанная строка байтов может быть записана в файл. Однако обратите внимание, что при чтении его обратно вы должны знать, в какой кодировке он находится, и декодировать его, используя ту же кодировку.
При записи в файлы вы можете избавиться от этого процесса кодирования / декодирования, используя модуль кодеков . Итак, чтобы открыть файл, который кодирует все строки Unicode в UTF-8 , используйте:
import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8
Обратите внимание, что все, кто использует эти файлы, должно понимать, в какой кодировке находится файл, если они хотят их прочитать. Если вы только читаете / пишете, это не проблема, в противном случае убедитесь, что вы пишете в форме, понятной для всех, кто использует файлы.
В Python 3 эта форма доступа к файлам используется по умолчанию, а встроенная openфункция принимает параметр кодирования и всегда переводит в / из строк Unicode (строковый объект по умолчанию в Python 3) для файлов, открытых в текстовом режиме.
Вот пример:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
utf8как показано здесь, результатом являются только вопросительные знаки? Вот изображение моего Python, версия 2.7.13. (Я могу кодировать другие объекты Unicode, такие как u"Klüft", но не евро?)
Что ж, если вы готовы / готовы перейти на Python 3 (что может не произойти из-за обратной несовместимости с некоторым кодом Python 2), вам не нужно делать никаких преобразований; Весь текст в Python 3 представлен строками Unicode, что также означает, что u'<text>'синтаксис больше не используется . У вас также есть, по сути, строки байтов, которые используются для представления данных (которые могут быть закодированной строкой).
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
(Конечно, если вы в настоящее время используете Python 3, проблема, скорее всего, связана с тем, как вы пытаетесь сохранить текст в файл.)
Вот пример кода
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
файл содержит строку в юникоде
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
для меня
f = open("56ad62-json.log", encoding="utf-8")
qq=f.readline()
print(qq)
{"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}
(qq.encode().decode("unicode-escape").encode().decode("unicode-escape"))
# '{"log":"message": "Авторизация пользователя"}\n'
result.encode().decode('unicode-escape')
Никакой ответ не работал для моего случая, где у меня была строковая переменная, содержащая символы Юникода, и никакой кодировки-декодирования, объясненные здесь, не помогли.
Если я делаю в терминале
echo "no me llama mucho la atenci\u00f3n"
или
python3
>>> print("no me llama mucho la atenci\u00f3n")
Вывод правильный:
output: no me llama mucho la atención
Но работа со скриптами, загружающими эту строковую переменную, не работала.
Вот что сработало в моем случае , на случай , если кто-нибудь поможет:
string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención
print type(unicode_string), repr(unicode_string)Python 3.x:print type(unicode_string), ascii(unicode_string)Затем отредактируйте свой вопрос и скопируйте / вставьте результаты вышеприведенного оператора печати. НЕ перепечатывать результаты. Также посмотрите вверху вашего HTML-кода и посмотрите, можете ли вы найти что-то вроде этого: <meta http-equ = "Content-Type" content = "text / html; charset = iso-8859