我正在处理一些本应为有效UTF-8但不是的数据文件,这导致解析器(不在我的控制之下)失败。我想添加一个阶段,以对UTF-8格式正确的数据进行预验证,但是我还没有找到可以帮助完成此操作的实用程序。
W3C上有一个Web服务似乎已失效,并且我发现了一个仅Windows的验证工具,该工具报告无效的UTF-8文件,但未报告要修复的行/字符。
我对可以插入并使用的工具(最好是跨平台)或可以将其作为数据加载过程一部分的ruby / perl脚本感到满意。
Answers:
您可以使用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。
iconv -f UTF-8 your_file > /dev/null 2>&1; echo $?
iconv -f UTF-8 -t UTF-8 your_file > /dev/null
以避免这些误报。
使用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')
您还可以使用recode
,如果尝试解码UTF-8并遇到无效字符,它将退出并显示错误。
if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
echo "Valid utf8 : $FILE"
else
echo "NOT valid utf8: $FILE"
fi
这会尝试将其重新编码为通用字符集(UCS),这始终可以通过有效的UTF-8进行。
recode utf8/..UCS < "$FILE" | recode UCS/..utf8
。遇到无效数据时,这将中止输出。
这是bash脚本,用于检查文件是否为有效的UTF-8:
#!/bin/bash
inputFile="./testFile.txt"
iconv -f UTF-8 "$inputFile" -o /dev/null
if [[ $? -eq 0 ]]
then
echo "Valid UTF-8 file.";
else
echo "Invalid UTF-8 file!";
fi
描述:
--from-code
,-f
编码(从编码转换字符)--to-code
,-t
编码(将字符转换为编码,不必指定,将假定为UTF-8。)--output
,-o
文件(指定输出文件“代替stdout”)