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

时间:2008-09-22 14:39:16

标签: validation utf-8 internationalization

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

W3C上有一个web service似乎已经死了,我发现只有Windows的验证tool会报告无效的UTF-8文件,但不报告哪些行/字符到固定。

我很满意我可以插入和使用的工具(理想的跨平台),或者我可以参与我的数据加载过程的ruby / perl脚本。

6 个答案:

答案 0 :(得分:83)

您可以使用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。

答案 1 :(得分:10)

使用python和str.encode |解码函数。

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

答案 2 :(得分:9)

您可以使用isutf8集合中的moreutils

$ apt-get install moreutils
$ isutf8 your_file

在shell脚本中,使用--quiet开关并检查退出状态,对于有效的utf-8文件,该状态为零。

答案 3 :(得分:4)

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

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

答案 4 :(得分:0)

您还可以使用recode,如果它尝试解码UTF-8并遇到无效字符,则会退出并显示错误。

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi

这会尝试将其重新编码为Universal Character Set (UCS),这始终可以通过有效的UTF-8进行。

答案 5 :(得分:0)

这是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”)