“如何判断一个含有中文字符串的字节长度”的扩展

“如何判断一个含有中文字符串的字节长度”的扩展

前因:

如何判断一个含有中文字符串的字节长度?很简单,一句话就可以搞定:

1
Encoding.Default.GetByteCount(mystr);

这个也是我在网上搜索到的一个答案,但是不理解Encoding的这个Default属性是什么意思,所以一路查下去,就引发了这篇文章。

首先想到的是Encoding.Default这个属性到底是什么意思?根据msdn的解释:获取系统的当前 ANSI 代码页的编码。

但是"ANSI 代码页"又是什么意思?还是搞不太懂哇,接着查资料吧……

代码页:代码页其实是字符集编码的别名,说道字符集我们就应该比较清楚了,常用的字符集有:ASCII 字符集GB2312 字符集Unicode字符集等吧。其余的我也不清楚了。

那看一下ANSI字符集是,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在ANSI编码中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储,这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码。ANSI编码表示英文字符时用一个字节,表示中文用两个字节,所以上文中提到的那个方法正好可以解决一开始提出的问题。

那Unicode字符集又是怎么回事儿呢?

unicode和ansi都是字符代码的一种表示形式,Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

以我们中文常用的utf-8编码为例:UTF-8的特点是对不同范围的字符使用不同长度的编码,

Unicode编码(16进制)  UTF-8 字节流(二进制)
000000 - 00007F  0xxxxxxx
000080 - 0007FF  110xxxxx 10xxxxxx
000800 - 00FFFF  1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

例:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

posted @ 2014-03-12 14:29  萧萧  阅读(718)  评论(0)    收藏  举报