我认为处理应该是有效的UTF-8,但不是一些数据文件,这将导致解析器(不在我的控制)失败。 我想补充的验证前期的数据UTF-8格式良好的舞台,但我没有找到一个实用程序来帮助做到这一点。
有一个Web服务 ,在W3C这似乎是死了,我已经找到了一个Windows的唯一验证工具 ,报告无效的UTF-8的文件,但不报告解决哪些行/字符。
我很高兴与任何一个工具,我可以下降,并使用(最好的跨平台),或红宝石/ Perl脚本,我可以让我的数据加载过程的一部分。
我认为处理应该是有效的UTF-8,但不是一些数据文件,这将导致解析器(不在我的控制)失败。 我想补充的验证前期的数据UTF-8格式良好的舞台,但我没有找到一个实用程序来帮助做到这一点。
有一个Web服务 ,在W3C这似乎是死了,我已经找到了一个Windows的唯一验证工具 ,报告无效的UTF-8的文件,但不报告解决哪些行/字符。
我很高兴与任何一个工具,我可以下降,并使用(最好的跨平台),或红宝石/ Perl脚本,我可以让我的数据加载过程的一部分。
您可以使用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。
使用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')
您可以使用isutf8从moreutils集合。
$ apt-get install moreutils
$ isutf8 your_file
在一个shell脚本,使用--quiet
开关,检查退出状态,这对于有效的UTF-8文件为零。
如何在GNU 的iconv库? 使用的iconv()函数:“无效的多字节序列在输入中遇到在这种情况下,它设置errno EILSEQ和返回(为size_t)( - 1)* INBUF留给指向无效的多字节序列的开始。 “
编辑:哦 - 我错过了你想要的脚本语言的一部分。 但对于命令行工作时, 的iconv实用程序应验证了你。
下面的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;
}