如何检查文件是否为有效的UTF-8?

时间:2020-03-06 14:32:34  来源:igfitidea点击:

我正在处理一些应该是有效UTF-8但不是的数据文件,这导致解析器(不在我的控制之下)失败。我想添加一个阶段,以对UTF-8格式正确的数据进行预验证,但是我还没有找到可以帮助完成此操作的实用程序。

W3C上有一个Web服务似乎已失效,并且我发现了一个仅Windows的验证工具,该工具报告无效的UTF-8文件,但不报告要修复的行/字符。

我对可以插入并使用的工具(最好是跨平台)或者可以在数据加载过程中参与的ruby / perl脚本感到满意。

解决方案

使用python和str.encode | decode函数。

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

引发的异常在其.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')

gnu iconv库怎么样?使用iconv()函数:"输入中遇到无效的多字节序列。在这种情况下,它将errno设置为EILSEQ并返回(size_t)(-1)。* inbuf指向无效的多字节序列的开头。 "

编辑:哦,我错过了我们想要脚本语言的部分。但是对于命令行工作,iconv实用程序也应该为我们验证。

我们可以使用GNU iconv:

$ iconv -f UTF-8 your_file -o /dev/null

或者使用较旧版本的iconv,例如在macOS上:

$ iconv -f UTF-8 your_file > /dev/null; echo $?

如果文件转换成功,该命令将返回0,否则返回1. 此外,它将打印出发生无效字节序列的字节偏移量。

编辑:不必指定输出编码,它将被假定为UTF-8.