字符编码

本文改编自新浪雪儿浅浅的博客,虽然算不上原创,但是也应该算不上转载。

1.ASCII(American Standard Code for Information Interchange)

美国信息交换标准代码

计算机上最早使用的通用的编码方案。那个时候计算机还只是拉丁文字的专利,根本没有想到现在计算机的发展势头,如果想到了,可能一开始就会使用unicode了。当时绝大部分专家都认为,要用计算机,必须熟练掌握英文。

这种编码占用7个Bit,在计算机中占用一个字节,8位,最高位没用,通讯的时候有时用作奇偶校验位。因此ASCII编码的取值范围实际上是:0x00-0x7f,只能表示128个字符。

后来发现128个不太够用,做了扩展,叫做ASCII扩展编码,用足八位,取值范围变成:0x00-0xff,能表示256个字符。其实这种扩展意义不大,因为256个字符表示一些非拉丁文字远远不够,但是表示拉丁文字,又用不完。所以扩展的意义还是为了下面的ANSI编码服务。


2. ANSI(American National Standard Institite )

美国国家标准协会

每个国家(非拉丁语系国家)自己制定自己的文字的编码规则,并得到了ANSI认可,符合ANSI的标准,在全世界范围表示对应国家文字的时候都通用这种编码就叫ANSI编码。

换句话说,中国的ANSI编码和在日本的ANSI的意思是不一样的,因为都代表自己国家的文字编码标准。比如中国的ANSI对应就是GB2312标准,日本就是JIT标准,香港,台湾对应的是BIG5标准等等。

微软从95开始,自己有一个标准GBK。GB2312里面只有6763个汉字,682个符号,有时候不是很够用。GBK一直能和GB2312相互混淆并且相安无事的一个重要原因是GBK全面兼容GB2312。

ANSI的标准是:
1.ASCII码在任何ANSI中应该都是相同的。
2.其他的,自己扩展。

GB2312

中国人把ASCII码变成8位,0x7f之前不动,从0xa0开始编。但0xa0到0xff才95个码位,不够用。因此,用两个字节,编码范围从0xA1A1 - 0xFEFE。这个范围可以表示23901个汉字。

GBK

GBK编码范围是从0x8140 - 0xFEFE,可以表示3万多个汉字。可以看出,这两种方案,都能保证汉字头一个字节在0x7f以上,从而和ASCII不会发生冲突。能够实现英文和汉字同时显示。

BIG5

香港和台湾用的比较多,繁体,范围: 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE,每个字由两个字节组成,其第一字节编码范围为0xA1~0xF9,第二字节编码范围为0x40-0x7E与0xA1-0xFE,总计收入13868个字 (包括5401个常用字、7652 个次常用字、7个扩充字、以及808个各式符号)。

那么到底ANSI是多少位呢?这个不一定!比如在GB2312和GBK,BIG5中,是两位!但是其他标准或者其他语言如果不够用,就完全可能不止两位!

例如:GB18030:GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位不够,字形不足的问题。它有几个特点:它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。编码是变长的,其二字节部分与GBK兼容;四字节部分是扩充的字形、字位,其编码范围是首字节0x81-0xfe、二字节0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。它的推广是分阶段的,首先要求实现的是能够完全映射到Unicode3.0标准的所有字形。它是国家标准,是强制性的。

ANSI有个致命的缺陷,就是每个标准不保证能兼容。换句话说,要同时显示中文和日本文或者阿拉伯文,就完全可能会出现一个编码两个字符集里面都有对应,不知道该显示哪一个的问题,也就是编码重叠的问题。显然这样的方案不好,所以Unicode才会出现!


Unicode(Universal Code)

万国表

以前有个codeepage(代码页),最早来自IBM,后来被微软,oracle ,SAP等广泛采用。治标不治本的可以统一使用ANSI的各个字符集了。
这个编码方案包含全世界所有文字的一个编码表,不管用的上,用不上,现在用的,以前用过的,只要这个世界上存在的文字符号,都有一个唯一的编码。这样就不可能有任何冲突了,不管要同时显示任何文字,都没有问题。

因此在这样的方案下,Unicode出现了。Unicode编码范围是:0-0x10FFFF,可以容纳1114112个字符,100多万。从码位范围看,严格的unicode需要3个字节来存储。但是考虑到理解性和计算机处理的方便性,理论上还是用4个字节来描述。

Unicode采用的汉字相关编码用的是《CJK统一汉字编码字符集》— 国家标准 GB13000.1 是完全等同于国际标准《通用多八位编码字符集 (UCS)》 ISO 10646.1。《GB13000.1》中最重要的也经常被采用的是其双字节形式的基本多文种平面。在这65536个码位的空间中,定义了几乎所有国家或地区的语言文字和符号。其中从0x4E00到 0x9FA5 的连续区域包含了 20902 个来自中国(包括台湾)、日本、韩国的汉字,称为 CJK (Chinese Japanese Korean) 汉字。CJK是《GB2312-80》、《BIG5》等字符集的超集。

具体实现算法Google之

在计算机中的实现

不可能所有情况都拿总表,太浪费资源,所以会有一下三种方案:

UTF-8(UCS Transformation Format 8bit)

之前要知道:
MBCS(Multi-Byte Chactacter System(Set)):多字节字符系统或者字符集
基于ANSI编码的原理上,对一个字符的表示实际上无法确定他需要占用几个字节的,只能从编码本身来区分和解释。因此计算机在存储的时候,就是采用多字节存储的形式,也就是你需要几个字节我给你放几个字节.在基于GBK的windows中,不会超过2个字节,所以windows这种表示形式有叫做DBCS(Double-Byte Chactacter System),其实算是MBCS的一个特例。C语言默认存放字符串就是用的MBCS格式。从原理上来说,这样是非常经济的一种方式。

这个方案的意思以8位为单位来标识文字,注意并不是说一个文字用8位标识。他其实是一种MBCS方案,可变字节的。到底需要几个字节表示一个符号,这个要根据这个符号的unicode编码来决定,最多4个字节。

具体规则Google之,能节省很多的空间。
简单知道以下内容就行:
1.不同Unicode编码区间有不同的二进制模板,不同的模板分别占用1B,2B,3B,4B。
2.模版中有规定空位可以将原来的Unicode16进制转换成的二进制插入
3.得到新的二进制,转换到16进制就是UTF-8的编码。

UTF-16(UCS Transformation Format 8bit)

UTF-16编码以16位无符号整数为单位。注意是16位为一个单位,不表示一个字符就只有16位。现在机器上的unicode编码一般指的就是UTF-16。绝大部分2个字节就够了,但是不能绝对的说所有字符都是2个字节。当超出范围的时候会使用一种叫代理的方式,占用4个字节,此时就不是2B了,但是毕竟少数。

UTF-32UCS Transformation Format 8bit)

直接实现的版本。
现在绝大部分机器实现unicode还是采用的UTF-16的方案。当然也有UTF-8的方案。比如windows用的就是UTF-16方案,不少linux用的就是UTF-8方案。







点击这里跳转到原文
或者复制原文地址:

http://blog.sina.com.cn/s/blog_4aa887440101arks.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值