Validation 如何检查文件是否为有效的UTF-8?
我正在处理一些应该是有效的UTF-8但不是的数据文件,这会导致解析器(不在我的控制之下)失败。我想添加一个对UTF-8格式良好的数据进行预验证的阶段,但我还没有找到一个实用程序来帮助实现这一点 W3C有一个似乎已经失效的验证,我发现了一个仅限Windows的验证,它报告无效的UTF-8文件,但不报告要修复的行/字符Validation 如何检查文件是否为有效的UTF-8?,validation,utf-8,internationalization,Validation,Utf 8,Internationalization,我正在处理一些应该是有效的UTF-8但不是的数据文件,这会导致解析器(不在我的控制之下)失败。我想添加一个对UTF-8格式良好的数据进行预验证的阶段,但我还没有找到一个实用程序来帮助实现这一点 W3C有一个似乎已经失效的验证,我发现了一个仅限Windows的验证,它报告无效的UTF-8文件,但不报告要修复的行/字符 我很乐意使用一个工具(理想情况下是跨平台的),或者使用一个ruby/perl脚本作为数据加载过程的一部分 使用python和str.encode | decode函数 >>
我很乐意使用一个工具(理想情况下是跨平台的),或者使用一个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
gnu图书馆怎么样?使用iconv()函数:“在输入中遇到无效的多字节序列。在这种情况下,它将errno设置为EILSEQ并返回(size_t)(-1)。*inbuf左指无效的多字节序列的开头。”
编辑:哦,我错过了你想要脚本语言的部分。但是对于命令行工作,该实用程序也应该为您进行验证。您可以使用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。您可以从集合中使用
$ apt-get install moreutils
$ isutf8 your_file
在shell脚本中,使用--quiet
开关并检查退出状态,对于有效的utf-8文件,退出状态为零。您也可以使用,如果尝试解码utf-8并遇到无效字符,退出状态将出错
如果重新编码utf8/.UCS<“$FILE”>/dev/null 2>&1;然后
echo“有效的utf8:$FILE”
其他的
echo“无效utf8:$FILE”
fi
这将尝试从有效的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
编码(将字符转换为编码,无需指定,假定为UTF-8。)-t
,--output
文件(指定输出文件“而不是stdout”)-o
iconv-f UTF-8您的_文件>/dev/null 2>&1;echo$?
“输出编码[…]将假定为UTF-8”与文档相矛盾,文档中说编码“默认为当前语言环境的编码”(GNU手册页)。如果该编码不支持输入中的任何字符,则将发出“无法转换”或“非法输入序列”错误,即使输入是有效的UTF-8。使用iconv-f UTF-8-t UTF-8您的\u文件>/dev/null
避免这些误报。对于mac os,“brew安装更多”。这会改变数据吗?我希望通过重新编码来流式传输数据,如果数据不好,则失败,如果数据好,则我希望数据保持不变utf8@Binyamin:是的,它会重新编码。在上面的示例中,它只是将重新编码的数据发送到/dev/null。但您也可以通过管道进行第二次重新编码,将其放回utf8:重新编码utf8/.UCS<“$FILE”|重新编码UCS/.utf8
。这将在遇到无效数据时中止输出。谢谢,我想我可能需要重新编码两次
#!/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