Преобразовать строку Юникода в строку в Python (содержащую дополнительные символы)
-
05-07-2019 - |
Вопрос
Как преобразовать строку Unicode (содержащую дополнительные символы, такие как & # 163; $ и т. д.) в строку Python?
Решение
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'
Другие советы
Вы можете использовать кодирование в ASCII, если вам не нужно переводить не-ASCII символы:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> 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'
Эта необработанная строка байтов может быть записана в файл. Однако обратите внимание, что при чтении обратно вы должны знать, в какой кодировке он находится, и декодировать его, используя ту же кодировку.
При записи в файлы вы можете избавиться от этого процесса кодирования / декодирования, используя кодеки модуль. Итак, чтобы открыть файл, который кодирует все строки Юникода в 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'
Что ж, если вы готовы / готовы перейти на 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')
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars