寻找样品以验证UTF-8

时间:2009-05-15 05:35:42

标签: c# validation utf-8

假设我有一个字节流(数组),我想编写代码(使用.Net C#)来验证它是否是有效的UTF-8字节序列。我想从头开始编写代码,因为我需要报告存在无效字节序列的确切位置,甚至可能删除无效字节 - 不只是想得到是或否字节流/数组是否有效。

是否有任何示例代码可供参考?如果没有C#代码,那么C ++ / Java中的简单示例也会受到赞赏。谢谢!

对于UTF-8的无效字节序列,我的意思是

http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences

提前谢谢, 乔治

4 个答案:

答案 0 :(得分:3)

您需要的是DecoderFallback。当Encoding类尝试将字节序列转换为目标编码时,您可以指定回退行为:

使用UTF8EncodingDecoderReplacementFallback,您可以实现您正在寻找的目标。

答案 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)

好的一点。我不知道存在无效的UTF-8序列。

维基迪亚的文章是一个起点,但我不认为你可以进行完整的测试。你能?我很感兴趣

完整的测试意味着对于每个序列,您可以拥有一个对每个可能的序列都回答是或否的函数。完整的功能。

如果你的序列不完整(一个短序列),关键是做什么或返回。据我所知,有些编辑器会添加一个特殊字符来实现它。可能是您应该处理无效序列等情况,然后您的测试将完成。 我想知道这是否是唯一的情况。

无论如何,我会把这个问题作为最喜欢的,以便跟踪答案。当然有人会照亮我们。

答案 3 :(得分:1)

static void CheckUTF8(byte[] data)
{
    new UTF8Encoding(false, true).GetCharCount(data);
}

对无效数据投掷DecoderFallbackExceptionDecoderFallbackException.Index应指向无效序列的索引。