Existe uma função de biblioteca Python que tenta adivinhar a de codificação de caracteres de alguns bytes?

votos
15

Eu estou escrevendo algum software de processamento de correio em Python que está encontrando bytes estranhos em campos de cabeçalho. Eu suspeito que este é o correio apenas mal formado; a própria mensagem afirma ser us-ascii, então eu não acho que há uma verdadeira codificação, mas eu gostaria de sair uma string unicode aproximar o original sem jogar um UnicodeDecodeError.

Então, eu estou procurando uma função que recebe um stre, opcionalmente, algumas dicas e faz o seu darndest para me dar de volta um unicode. Eu poderia escrever um é claro, mas se esta função exista seu autor provavelmente pensou um pouco mais sobre a melhor maneira de fazer isto.

Sei também que o projeto de Python prefere explícita ao implícito e que a biblioteca padrão é projetado para evitar a magia implícita no texto decodificação. Eu só quero dizer explicitamente vá em frente e acho.

Publicado 06/11/2008 em 16:18
fonte usuário
Em outras línguas...                            


4 respostas

votos
21

Você pode estar interessado em Universal Encoding Detector .

Respondeu 06/11/2008 em 16:26
fonte usuário

votos
19

+1 para o chardet módulo (sugerido por @insin).

Não é na biblioteca padrão, mas você pode facilmente instalá-lo com o seguinte comando:

$ pip install chardet

exemplo :

>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}    
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Veja Instalação Pip se você não tiver um.

Respondeu 06/11/2008 em 17:13
fonte usuário

votos
1

A melhor maneira de fazer isso que eu encontrei é tentar iteratively decodificar um estudo prospectivo com cada uma das codificações mais comuns dentro de um try, exceto bloco.

Respondeu 07/11/2008 em 03:31
fonte usuário

votos
12

Tanto quanto eu posso dizer, a biblioteca padrão não tem uma função, embora não seja muito difícil de escrever um como sugerido acima. Eu acho que a coisa real que eu estava procurando era uma maneira de decodificar uma string e garantir que não iria lançar uma exceção. O parâmetro erros para string.decode faz isso.

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')
Respondeu 07/11/2008 em 22:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more