Converter uma seqüência de caracteres Unicode em uma string em Python (contendo símbolos extras)
-
05-07-2019 - |
Pergunta
Como você converter uma seqüência de caracteres Unicode (contendo caracteres extras, como £ $, etc.) em uma string Python?
Solução
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'
Outras dicas
Você pode usar codificar a ASCII se você não precisa traduzir os caracteres não-ASCII:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'
Se a string contém apenas caracteres ASCII.
Se você tem uma seqüência de caracteres Unicode, e você quer escrever este para um arquivo, ou outra forma serializada, você deve primeiro codificação -lo em uma representação particular, que podem ser armazenados. Existem várias codificações comuns Unicode, tais como UTF-16 (usos dois bytes para a maioria dos caracteres Unicode) ou UTF-8 (1-4 bytes / ponto de código, dependendo do carácter), etc. Para converter essa cadeia para uma codificação específica, pode usar:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
Esta corda crua de bytes podem ser gravados em um arquivo. No entanto, nota que quando lê-lo de volta, você deve saber que codificação que se encontra e decodificá-lo usando essa mesma codificação.
Ao escrever aos arquivos, você pode se livrar desse processo manual de codificação / decodificação usando a codecs módulo . Assim, para abrir um arquivo que codifica todas as cadeias de caracteres Unicode em UTF-8 , use:
import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8
Note que qualquer outra coisa que está usando esses arquivos devem entender o que codificar o arquivo está em se quiserem lê-los. Se você é o único a fazer a leitura / escrita este não é um problema, caso contrário, certifique-se de escrever de uma forma compreensível por qualquer outra coisa que usa os arquivos.
Em Python 3, esta forma de acesso a arquivos é o padrão, e as built-in função open
terá um parâmetro de codificação e sempre se traduz de / para cadeias de caracteres Unicode (o objeto cadeia padrão em Python 3) para arquivos abertos no texto mode.
Aqui está um exemplo:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
Bem, se você estiver disposto / pronto para mudar para Python 3 (que você não pode ser devido à incompatibilidade para trás com algum código Python 2), você não tem que fazer qualquer conversão; todo o texto em Python 3 é representado com cadeias de caracteres Unicode, o que também significa que não há mais uso da sintaxe u'<text>'
. Você também tem o que são, na verdade, cordas de bytes, que são usados ??para representar dados (que pode ser uma string codificada).
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
(Claro, se você estiver usando Python 3, então o problema é provavelmente algo a ver com a forma como você está tentando salvar o texto em um arquivo.)
Aqui está um exemplo de código
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