Existe uma função de biblioteca Python que tentativas de adivinhar o de codificação de caracteres de alguns bytes? [duplicado]

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

Pergunta

Esta questão já tem uma resposta aqui:

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 leva um str e, 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.

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

Foi útil?

Solução 3

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 garantia de 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')

Outras dicas

1 para a 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'}

Instalando Pip se você não tiver um.

Você pode estar interessado em Universal Encoding Detector .

A melhor maneira de fazer isso que eu encontrei é a forma iterativa tentar decodificar um estudo prospectivo com cada um dos maioria dos codificações comuns dentro de um try, exceto bloco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top