假设我有一个字节流(数组),我想编写代码(使用.Net C#)来验证它是否是有效的UTF-8字节序列。我想从头开始编写代码,因为我需要报告存在无效字节序列的确切位置,甚至可能删除无效字节 - 不只是想得到是或否字节流/数组是否有效。
是否有任何示例代码可供参考?如果没有C#代码,那么C ++ / Java中的简单示例也会受到赞赏。谢谢!
对于UTF-8的无效字节序列,我的意思是
提前谢谢, 乔治答案 0 :(得分:3)
您需要的是DecoderFallback。当Encoding
类尝试将字节序列转换为目标编码时,您可以指定回退行为:
使用UTF8Encoding
和DecoderReplacementFallback
,您可以实现您正在寻找的目标。
答案 1 :(得分:2)
这就是原始问题所要求的,即使它不是原始海报真正需要的。但是,我已经写了some C code to validate a byte stream as utf-8,并将其免费提供。也许通过Google搜索针对此问题的其他人会发现它很有用。
一次需要一个字节,因此适用于流处理,并将所有内容分类为有效的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 中编码的所有字符。也就是说,无效的字节序列不能吃掉在坏字节之后开始的有效编码字符。
答案 2 :(得分:1)
维基迪亚的文章是一个起点,但我不认为你可以进行完整的测试。你能?我很感兴趣
完整的测试意味着对于每个序列,您可以拥有一个对每个可能的序列都回答是或否的函数。完整的功能。
如果你的序列不完整(一个短序列),关键是做什么或返回。据我所知,有些编辑器会添加一个特殊字符来实现它。可能是您应该处理无效序列等情况,然后您的测试将完成。 我想知道这是否是唯一的情况。
无论如何,我会把这个问题作为最喜欢的,以便跟踪答案。当然有人会照亮我们。
答案 3 :(得分:1)
static void CheckUTF8(byte[] data)
{
new UTF8Encoding(false, true).GetCharCount(data);
}
对无效数据投掷DecoderFallbackException
。 DecoderFallbackException.Index
应指向无效序列的索引。