我正在处理一些应该是有效的 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|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 进行。
这是检查文件是否为有效 UTF-8 的 bash 脚本:
#!/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
file (Specify output file 'instead of stdout')