我正在处理一些应该是有效的UTF-8但不是的数据文件,这导致解析器(不受我的控制)失败.我想为UTF-8格式良好地添加预先验证数据的阶段,但我还没有找到帮助实现这一目标的实用程序.
在W3C上有一个Web服务似乎已经死了,我找到了一个仅用于Windows的验证工具,它报告了无效的UTF-8文件,但没有报告要修复的行/字符.
无论是我可以插入和使用的工具(理想情况是跨平台),还是我可以参与我的数据加载过程的ruby/perl脚本,我都会感到满意.
你可以使用GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
或者使用旧版本的iconv,例如在macOS上:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
如果文件可以成功转换,该命令将返回0,否则返回1.此外,它将打印出无效字节序列发生的字节偏移量.
编辑:不必指定输出编码,它将被假定为UTF-8.
使用python和str.encode |解码函数.
>>> 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 "", line 1, in 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
抛出的异常在其.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')
您可以使用isutf8从moreutils集合.
$ apt-get install moreutils $ isutf8 your_file
在shell脚本中,使用--quiet
开关并检查退出状态,对于有效的utf-8文件,该状态为零.