【操作系统】字符编码gb2312与utf-16的比较

“从GB2313-标准字符集、GBK-大字符集到GB18030-超大字符集 ”。 

多字节字符集(MBCS)是相对单字节字符集(SBCS)来说的,在单字节字符集里,一个字节表示一个字符,对于英文和大多数欧洲语言来说这就够用了。但对于中日韩以及阿拉伯文字来说就不够了,比如在汉字GB2312标准里,英文字符用1个字节,汉字用2个字节;而另外一些语言可能是变长的,一个字可能是1个、2个、3个字节来表示。不管是单字节字符集还是多字节字符集,都是各个国家自己制定的(后来美国国家标准化委员会进行了标准化,所以也可以把单字节集和多字节字符集的总合简称ANSI字符集)。大家可以想到,日本在制定日语编码标准的时候,他不会考虑是否会跟汉语冲突,当然制定汉语编码标准的时候也不会考虑是否跟韩语或阿拉伯文冲突,所以不同语言的多字节编码是冲突的,也就是说如果给你一个字符串,你根本不知道怎么处理它,因为你不知道它是那种语言的哪种编码,只能猜!(猜错了就是大家时不时看到的显示乱码) 

  

而Wide-Character即UNICODE是将全世界的所有文字统一编码,在UTF-16中每个字都是2字节,不管是英文还是中文、日文、阿拉伯文,都一样,而且一个码一个字,在那种语言平台上都对应相同的字。 

  

为什么说UNICODE通常占用更多空间?举例来说,对于字符串“中国ABC”,总共5个字符用UTF-16编码需要5*2=10个字节。而如果用我们的GB2312(多字节字符集),则需要区分汉字和英文,前两个汉字用2*2=4个自己,后面3个字符用3*1=3个字节。所以总共需要4+3=7个字节。所以说用UNICODE编码通常比用多字节编码要用多一点的内存,极端情况就是用UNICODE编码全英文字符串,那就是2倍的空间。 

  

但是为什么说UNICODE编码处理速度快呢?以刚才的“中国ABC”为例,如果用MBCS虽然省了3个字节,但是用起来可就麻烦了。对程序来说,它看到就是一个7个字节的数据,如果现在需要取出串里的第4个字符即'B',怎么写代码?你怎么知道第4个字符在什么位置?它是一个字节还是两个字节?办法就是根据汉字编码的规律,比如第一个字节总是大于0x80,然后从头至尾开始数:第一个字节大于0x80所以这是个汉字,占用2个字节,指针加2,字符计数加1;第三个字节大于0x80所以这也是个汉字,占用2个字节,指针加2,字符计数加1;第五个字节小于0x80所以是个英文,占用1个字节...........还好,我们的例子只有5个字符,如果是一个很大的文本文件呢?是不是效率极低?而用UNICODE编码则很简单,反正一个字符2个字节(UTF-16),所以你要第4个字符,就是第8个字节开始的双字节。直接就可以定位当然速度快了。 

  

但是UNICODE的好处不仅仅如此,它至少还有以下好处: 

1. 你不用担心在不同语言的平台上你的字符串会显示成乱码,只要它支持UNICODE,你的字符串在哪显示都一样。你的汉字UNICODE串在英文平台上也一样显示成汉字。如果用多字节编码,恐怕只能显示成乱码,因为它不知道你是哪个语言的(IE有一些猜测的方法)。 

  

2. 你的代码不容易出错。对UTF-16来说,一个字符2个字节,你的软件卖到哪个国家都对。而要是用多字节编码,你不得不使用与当前语言相关的编码特点,比如你觉得第一个字节大于0x80就是一个汉字,那换个语言平台你保准不对。即便你使用各种手段,整的你头发都掉光,一千个一万个小心,你还是会出错。因为你的开发环境和运行环境不一样,你没有办法在那么多环境组合里进行调试和测试!你也没那么多语言知识! 

  

3. 使用多字节编码,有些问题会非常难处理。比如在一个编辑器里,用户用鼠标选择了一段文字,为了避免出现选择“半个汉字”的怪事,你就不好办。自动换行的时候,也要避免把一个汉字分成两半。这还是汉字编码呢,有些文字更惨,三个字节在一起是一个字,把它们分开就变成另外两个意思完全不同的字。想象一下,如果因为你的编辑器自动换行了,本来意思是“我爱你”,结果显示成“我恨死你”是什么结果吧! 

补充一点:UNICODE存储通常需要更多空间的缺点(通常是英文和欧洲文字的用户抱怨这个)也是可以解决的,通常的做法就是压缩存储。即存储或者通过网络传输的时候的经过简单压缩,用的时候再解压缩。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值