首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找用于验证UTF-8的示例

寻找用于验证UTF-8的示例
EN

Stack Overflow用户
提问于 2009-05-15 05:35:42
回答 4查看 6K关注 0票数 3

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

有没有可供参考的示例代码?如果没有C#代码,也欢迎使用C++/Java编写简单的示例。谢谢!

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

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

先谢谢你,乔治

EN

回答 4

Stack Overflow用户

发布于 2009-05-15 06:37:20

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

无论是report error and stop processing.

  • Or find the error and replace it.

还是

使用UTF8EncodingDecoderReplacementFallback,你可以实现你想要的东西。

票数 3
EN

Stack Overflow用户

发布于 2009-05-21 11:23:08

这就是原始问题所要求的,即使它并不完全是原始海报真正需要的。但是,我已经编写了some C code to validate a byte stream as utf-8,并将其免费提供给用户。也许其他通过谷歌搜索这个问题的人会发现它很有用。

它一次处理一个字节,因此适用于流处理,并将所有内容分类为有效的UTF-8或字节序列中可能出现的错误之一:

代码语言:javascript
复制
/* 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
EN

Stack Overflow用户

发布于 2015-07-11 00:24:06

代码语言:javascript
复制
static void CheckUTF8(byte[] data)
{
    new UTF8Encoding(false, true).GetCharCount(data);
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/867104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档