字符串长度

我记得C#的面试题屡屡出现求字符串的长度的:

            string hi = "hi广州";
            string res = String.Format(@"{{""data"":""{0}""}}", 
                hi.Length                                                   //4
                + "," + Encoding.ASCII.GetBytes(hi).Length                  //4
                + "," + Encoding.GetEncoding("gb2312").GetBytes(hi).Length  //6,每个汉字gb2312编码为2字节
                + "," + Encoding.GetEncoding("utf-8").GetBytes(hi).Length   //8,每个汉字utf-8编码为3字节
                );


ASCII

美国人将拉丁字符与二进制对应起来。一个字节8位,用了前面7位,最高位为0,因此可以对应128个字符。

扩展ASCII

ASCII码对应128个西文,但欧洲有些国家的字母未能包含在内,于是利用闲置的最高位,可多对应128个字符,多出来的字符编码成为扩展编码。不同国家,例如法国、俄国,其扩展编码就不一样。


ANSI

为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。


Unicode

又叫万国码,统一码,使用它,妈妈再也不用担心地球上会有字符遗漏。

但是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。什么意思呢?

比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。那么这里是用2个字节,还是3个字节来存储呢?字节的顺序是怎样的呢(所谓的大头、小头方式)?因此就有了 UTF-8,UTF-16,UTF-32等等具体编码方式。


UTF

UTF-8最流行,因为其可变长,对应ASCII码字符1个字节,汉字3个字节,等等;而UTF-16固定双字节,利于传输。


参考资料

http://www.cppblog.com/qiujian5628/archive/2008/01/24/41773.html



posted on 2014-08-04 22:21  左直拳  阅读(387)  评论(0编辑  收藏  举报

导航