Como verificar se um arquivo é válido UTF-8?
-
02-07-2019 - |
Pergunta
Estou processando alguns arquivos de dados que são supostamente para ser válido UTF-8, mas não são, o que provoca o analisador (não sob meu controle) a falhar. Eu gostaria de adicionar uma etapa de pré-validação dos dados para UTF-8 boa formação, mas eu ainda não encontrei um utilitário para ajudar a fazer isso.
Há um web serviço W3C que parece ser morto, e eu encontrei um Windows-only validação ferramenta que relatórios inválidos arquivos UTF-8, mas não informa quais linhas / caracteres para correção.
Eu ficaria feliz com qualquer uma ferramenta que pode cair ea utilização (o ideal é cross-platform), ou um rubi / perl script que pode fazer parte do meu processo de carregamento de dados.
Solução
Você pode usar o GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
Ou com versões mais antigas do iconv, como no MacOS:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
O comando irá retornar 0 se o arquivo pode ser convertido com sucesso, e 1 se não. Além disso, ele irá imprimir o deslocamento onde a seqüência de byte inválido ocorreu byte.
Outras dicas
Use python e str.encode |. Funções de decodificação
>>> a="γεια"
>>> a
'\xce\xb3\xce\xb5\xce\xb9\xce\xb1'
>>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed
>>> print b.decode("utf_8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte
A exceção lançada tem a informação solicitada na sua propriedade .args.
>>> try: print b.decode("utf_8")
... except UnicodeDecodeError, exc: pass
...
>>> exc
UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
>>> exc.args
('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
Como sobre o gnu iconv biblioteca ? Usando a função iconv ():. ". Uma sequência multibyte inválido é encontrado na entrada Neste caso ele define errno para EILSEQ e volta (size_t) (- 1) * InBuf está apontando esquerdo para o início da sequência multibyte inválido. "
EDIT: oh - eu perdi a parte onde você quer uma linguagem de script. Mas para o trabalho de linha de comando, o utilitário iconv deve Validar para você também.