Como você converte uma string Unicode (contendo caracteres extras, como $ $ etc.) em uma string Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Como você converte uma string Unicode (contendo caracteres extras, como $ $ etc.) em uma string Python?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Respostas:
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
string em a str
é soltar ou converter os caracteres que não podem ser representados em ASCII. Então, um de mim.
type(title) == unicode and type(title.encode('utf-8')) == str
. Não há necessidade de corromper a entrada, para obter uma cadeia de bytes que pode ser salva em um arquivo.
Você pode usar a codificação para ASCII se não precisar converter os caracteres não ASCII:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
ignore
vsreplace
a.encode('ascii', 'xmlcharrefreplace')
dá 'aaaàçççñññ'
.
type(a)
está str
no Python 3.6.8 e não possui nenhum encode()
método.
>>> text=u'abcd'
>>> str(text)
'abcd'
Se a sequência contiver apenas caracteres ascii.
Se você possui uma seqüência de caracteres Unicode e deseja gravá-la em um arquivo ou outro formulário serializado, primeiro deve codificá- la em uma representação específica que possa ser armazenada. Existem várias codificações Unicode comuns, como UTF-16 (usa dois bytes para a maioria dos caracteres Unicode) ou UTF-8 (1-4 bytes / ponto de código, dependendo do caractere), etc. Para converter essa sequência em uma codificação específica, você deve pode usar:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
Essa sequência bruta de bytes pode ser gravada em um arquivo. No entanto, observe que, ao lê-lo novamente, você deve saber em que codificação está e decodificá-lo usando a mesma codificação.
Ao gravar em arquivos, você pode se livrar desse processo manual de codificação / decodificação usando o módulo de codecs . Portanto, para abrir um arquivo que codifica todas as seqüências Unicode no 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
Observe que qualquer outra coisa que esteja usando esses arquivos deve entender em que codificação está o arquivo se eles quiserem lê-los. Se você é o único a fazer a leitura / gravação, isso não é um problema; caso contrário, certifique-se de escrever de uma forma compreensível por qualquer outra pessoa que use os arquivos.
No Python 3, essa forma de acesso ao arquivo é o padrão, e a open
função interna aceita um parâmetro de codificação e sempre traduz de / para strings Unicode (o objeto de string padrão no Python 3) para arquivos abertos no modo de texto.
Aqui está um exemplo:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
utf8
como mostrado aqui, o resultado é apenas pontos de interrogação? Aqui está uma imagem do meu Python, versão 2.7.13. (I pode codificar outros objetos unicode como u"Klüft"
, mas não os Euros?)
Bem, se você estiver disposto / pronto para mudar para o Python 3 (o que pode não ser devido à incompatibilidade reversa com algum código do Python 2), você não precisa fazer nenhuma conversão; todo o texto no Python 3 é representado por strings Unicode, o que também significa que não há mais uso da u'<text>'
sintaxe. Você também tem o que são, na verdade, cadeias de bytes, que são usadas para representar dados (que podem ser uma cadeia codificada).
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
(Obviamente, se você estiver usando o Python 3, provavelmente o problema está relacionado à maneira como você está tentando salvar o texto em um arquivo.)
Aqui está um código de exemplo
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
O arquivo contém uma seqüência de caracteres com escape em unicode
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
para mim
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')
Nenhuma resposta funcionou para o meu caso, onde eu tinha uma variável de string contendo caracteres unicode e nenhuma codificação-decodificação explicada aqui fez o trabalho.
Se eu fizer em um terminal
echo "no me llama mucho la atenci\u00f3n"
ou
python3
>>> print("no me llama mucho la atenci\u00f3n")
A saída está correta:
output: no me llama mucho la atención
Mas trabalhar com scripts que carregam essa variável de sequência não funcionou.
Isto é o que funcionou no meu caso , no caso de ajudar alguém:
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)
edite sua pergunta e copie / cole os resultados da declaração de impressão acima. NÃO redigite os resultados. Também olhar para cima perto do topo de sua HTML e veja se você pode encontrar algo parecido com isto: <meta http-equiv = "Content-Type" content = "text / html; charset = iso-8859