假设我有一个字节流(数组),我想编写代码(使用.Net C#)来验证它是否是合法的UTF-8字节序列。我想从头开始编写代码,因为我需要报告存在无效字节序列的确切位置,甚至可能删除无效字节--而不仅仅是想得到字节流/数组是否有效的yes或no。
有没有可供参考的示例代码?如果没有C#代码,也欢迎使用C++/Java编写简单的示例。谢谢!
对于UTF-8的无效字节序列,我的意思是
http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences
先谢谢你,乔治
发布于 2009-05-15 06:37:20
您需要的是DecoderFallback。当Encoding类尝试将字节序列转换为目标编码时,您可以指定回退行为:
无论是report error and stop processing.
还是
使用UTF8Encoding和DecoderReplacementFallback,你可以实现你想要的东西。
发布于 2009-05-21 11:23:08
这就是原始问题所要求的,即使它并不完全是原始海报真正需要的。但是,我已经编写了some C code to validate a byte stream as utf-8,并将其免费提供给用户。也许其他通过谷歌搜索这个问题的人会发现它很有用。
它一次处理一个字节,因此适用于流处理,并将所有内容分类为有效的UTF-8或字节序列中可能出现的错误之一:
/* Ways a UTF stream can screw up */
/* a multibyte sequence without as many continuation bytes as expected. e.g. [ef 81] 48 */
#define MISSING_CONTINUATION 1
/* A continuation byte when not expected */
#define UNEXPECTED_CONTINUATION 2
/* A full multibyte sequence encoding something that should have been encoded shorter */
#define OVERLONG_FORM 3
/* A full multibyte sequence encoding something larger than 10FFFF */
#define OUT_OF_RANGE 4
/* A full multibyte sequence encoding something in the range U+D800..U+DFFF */
#define BAD_SCALAR_VALUE 5
/* bytes 0xFE or 0xFF */
#define INVALID 6这个验证器有一个很好的特性,如果a和b是有效的utf-8字节流,而x是其他一些字节流,那么a+x+b的连接将被解码为a中编码的所有字符,字符和错误的某种组合,然后是x中编码的所有字符。也就是说,无效的字节序列不能吃从坏字节之后开始的有效编码的字符。
发布于 2015-07-11 00:24:06
static void CheckUTF8(byte[] data)
{
new UTF8Encoding(false, true).GetCharCount(data);
}对无效数据引发DecoderFallbackException。DecoderFallbackException.Index应指向无效序列的索引。
https://stackoverflow.com/questions/867104
复制相似问题