Eu tenho um servidor de soquete que deveria receber caracteres válidos UTF-8 dos clientes.
O problema é que alguns clientes (principalmente hackers) estão enviando todo o tipo errado de dados sobre ele.
Posso distinguir facilmente o cliente genuíno, mas estou registrando nos arquivos todos os dados enviados para poder analisá-los mais tarde.
Às vezes, recebo caracteres como esse œ
que causam o UnicodeDecodeError
erro.
Eu preciso ser capaz de criar a string UTF-8 com ou sem esses caracteres.
Atualizar:
Para meu caso particular, o serviço de soquete era um MTA e, portanto, espero receber apenas comandos ASCII, como:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
Eu estava registrando tudo isso no JSON.
Então algumas pessoas por aí, sem boas intenções, decidiram vender todo tipo de lixo.
É por isso que, no meu caso específico, é perfeitamente aceitável remover os caracteres não ASCII.
fonte
Respostas:
http://docs.python.org/howto/unicode.html#the-unicode-type
ou
Nota: Isso removerá (ignorará) os caracteres em questão retornando a sequência sem eles.
Para mim, esse é o caso ideal, pois estou usando-o como proteção contra entradas não-ASCII, que não são permitidas pelo meu aplicativo.
Como alternativa: use o método open do
codecs
módulo para ler no arquivo:fonte
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
, que se transforma emu'\ufffdmsterdam'
com substituaopen(file_name, "rb")
e depois aplicar a abordagem de Ben nos comentários acimaMudar o mecanismo de C para Python fez o truque para mim.
O motor é C:
O mecanismo é Python:
Sem erros para mim.
fonte
csv
arquivo enorme . Isso pode levar a umOutOfMemory
erro ou a uma reinicialização automática do kernel do seu notebook. Você deve definirencoding
neste caso.Esse tipo de problema surge para mim agora que mudei para o Python 3. Eu não fazia ideia de que o Python 2 estava simplesmente lançando problemas com a codificação de arquivos.
Encontrei esta boa explicação sobre as diferenças e como encontrar uma solução depois que nenhuma das opções acima funcionou para mim.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Em resumo, para fazer com que o Python 3 se comporte da maneira mais semelhante possível ao uso do Python 2:
No entanto, leia o artigo, não existe uma solução única para todos os tamanhos.
fonte
fonte
used by default in the legacy components of Microsoft Windows in English and some other Western languages
Eu tive o mesmo problema
UnicodeDecodeError
e resolvi-o com esta linha. Não sei se é o melhor caminho, mas funcionou para mim.fonte
o primeiro, usando get_encoding_type para obter o tipo de arquivo de codificação:
o segundo, abrindo os arquivos com o tipo:
fonte
Apenas no caso de alguém tem o mesmo problema. Estou usando o vim com o YouCompleteMe , falha ao iniciar o ycmd com esta mensagem de erro, o que fiz foi:
export LC_CTYPE="en_US.UTF-8"
o problema desapareceu.fonte
export LC_CTYPE="en_US.UTF-8"
?O que você pode fazer se precisar alterar um arquivo, mas não souber a codificação do arquivo? Se você sabe que a codificação é compatível com ASCII e deseja examinar ou modificar apenas as partes ASCII, é possível abrir o arquivo com o manipulador de erros surrogateescape:
fonte
Eu resolvi esse problema apenas adicionando
fonte