validation - validator使用 - spring validator注解




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

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

在W3C上有一个Web服务似乎已经死了,我找到了一个仅用于Windows的验证tool ,它报告了无效的UTF-8文件,但没有报告要修复的行/字符。

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


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

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


下面的C ++代码基于通过Internet在许多站点上发布的代码。 我纠正了原始代码中的错误,并添加了检索无效字符位置和无效字符本身的可能性。

///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;
}

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

您可以使用moreutils集合中的moreutils

$ apt-get install moreutils
$ isutf8 your_file

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





internationalization