“如何判断一个含有中文字符串的字节长度”的扩展
“如何判断一个含有中文字符串的字节长度”的扩展
前因:
如何判断一个含有中文字符串的字节长度?很简单,一句话就可以搞定:
|
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。

浙公网安备 33010602011771号