Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 如何检查文件是否为有效的UTF-8?_Validation_Utf 8_Internationalization - Fatal编程技术网

Validation 如何检查文件是否为有效的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函数 >>

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

W3C有一个似乎已经失效的验证,我发现了一个仅限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
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
    -t
    编码(将字符转换为编码,无需指定,假定为UTF-8。)
  • --output
    -o
    文件(指定输出文件“而不是stdout”)

在旧版本的iconv中,如OSX或fink上的iconv,没有-o标志。不过,重定向stdout应该总是有效的。Torsten,谢谢,这在我的linux机器上非常有效。我找不到cygwin的iconv实用程序版本,但这不是一个showstopper。如果您不介意通过指定:UTF-8//TRANSLIT、UTF-8//IGNORE甚至UTF-8//TRANSLIT//IGNORE而丢失一些信息,您也可以使用该工具来清理文件,将stdout和stderr重定向到/dev/null:
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