计算中文字符长度,通常会想到1个中文字符占两个字节。我本来一直也这么认为,可是一次计算utf-8中文字符的时候,似乎又并没这样计算,这就要看中文到底是以什么机器可识别字符存储的。
我首先在PHP中做了实验,用strlen()函数取中文字符串“我是”的长度,在UTF-8下是6,在GBK下是4,说明UTF-8每个中文字符占用了3字节,GBK每个中文字符占用2字节。
然后我又在WINDOWS 7下用EditPlus做了实验,分别保存纯文本(不含任何空格,只有末尾空字符,不算入长度)“我是”,然后用十六进制的方法查看,UTF-8下是"E6 88 91 E6 98 AF" 和 GBK下是"CE D2 CA C7",和PHP中所得结果相同。
所以基本确定了这两种字符集在处理中文时的不同。在我查资料前,我凭经验猜测,因为GBK主要存储是中文字符集,所表示字符的种类没有UTF-8这种国际通用字符集表示的种类多,自然不需要太大的字符空间。再查阅了UTF-8的原理,在看刚才中文字符的十六进制表示,如下:
0xxxxxxx ——1个字节
110xxxxx 10xxxxxx ——2个字节
1110xxxx 10xxxxxx 10xxxxxx ——3个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ——4个字节
"E6" 中主要看前面的"E",E=1110,表示由三个字节组成字符,所以中文这类才用3字节表示。