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.

Foi útil?

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.

Editar :. A codificação de saída não tem de ser especificada, será assumido para ser UTF-8

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

Você pode usar isutf8 do moreutils coleção.

$ apt-get install moreutils
$ isutf8 your_file

Em um script shell, use a opção --quiet e verificar o status de saída, que é zero para arquivos que são válidas utf-8.

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.

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