Converter uma seqüência de caracteres Unicode em uma string em Python (contendo símbolos extras)

StackOverflow https://stackoverflow.com/questions/1207457

Pergunta

Como você converter uma seqüência de caracteres Unicode (contendo caracteres extras, como £ $, etc.) em uma string Python?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top