72

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

W3C 上有一个Web 服务似乎已经死了,我发现了一个仅限 Windows 的验证工具,它报告无效的 UTF-8 文件,但不报告要修复的行/字符。

我会很高兴有一个我可以放入并使用的工具(理想情况下是跨平台的),或者一个我可以作为数据加载过程的一部分的 ruby​​/perl 脚本。

4

6 回答 6

102

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

于 2008-09-22T14:48:53.490 回答
9

使用 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')
于 2008-09-22T14:44:16.123 回答
9

您可以使用moreutils集合中的isutf8

$ apt-get install moreutils
$ isutf8 your_file

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

于 2016-05-26T02:49:25.327 回答
5

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

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

于 2008-09-22T14:46:06.133 回答
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

这会尝试重新编码为通用字符集 (UCS),这始终可以从有效的 UTF-8 进行。

于 2020-02-20T20:43:42.877 回答
0

这是检查文件是否为有效 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')
于 2020-04-07T15:04:10.233 回答