如何检查文件是否是有效的UTF-8?(How to check whether a file is

2019-06-17 11:26发布

我认为处理应该是有效的UTF-8,但不是一些数据文件,这将导致解析器(不在我的控制)失败。 我想补充的验证前期的数据UTF-8格式良好的舞台,但我没有找到一个实用程序来帮助做到这一点。

有一个Web服务 ,在W3C这似乎是死了,我已经找到了一个Windows的唯一验证工具 ,报告无效的UTF-8的文件,但不报告解决哪些行/字符。

我很高兴与任何一个工具,我可以下降,并使用(最好的跨平台),或红宝石/ Perl脚本,我可以让我的数据加载过程的一部分。

Answer 1:

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



Answer 2:

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


Answer 3:

您可以使用isutf8从moreutils集合。

$ apt-get install moreutils
$ isutf8 your_file

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



Answer 4:

如何在GNU 的iconv库? 使用的iconv()函数:“无效的多字节序列在输入中遇到在这种情况下,它设置errno EILSEQ和返回(为size_t)( - 1)* INBUF留给指向无效的多字节序列的开始。 “

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



Answer 5:

下面的C ++代码是基于一个贴过许多网站在互联网上。 我在原来的代码更正错误,并添加到检索无效字符和无效字符本身的两个位置的可能性。

///Returns -1 if string is valid. Invalid character is put to ch.
int getInvalidUtf8SymbolPosition(const unsigned char *input, unsigned char &ch) {
  int                 nb, na;
  const unsigned char *c = input;

  for (c = input;  *c;  c += (nb + 1)) {
    if (!(*c & 0x80))
        nb = 0;
    else if ((*c & 0xc0) == 0x80)
    {
        ch = *c;
        return (int)c - (int)input;
    }
    else if ((*c & 0xe0) == 0xc0)
        nb = 1;
    else if ((*c & 0xf0) == 0xe0)
        nb = 2;
    else if ((*c & 0xf8) == 0xf0)
        nb = 3;
    else if ((*c & 0xfc) == 0xf8)
        nb = 4;
    else if ((*c & 0xfe) == 0xfc)
        nb = 5;
    na = nb;
    while (na-- > 0)
      if ((*(c + nb) & 0xc0) != 0x80)
      {
          ch = *(c + nb);
          return (int)(c + nb) - (int)input;
      }
  } 

  return -1;
}


文章来源: How to check whether a file is valid UTF-8?