大话字符编码发展史
ASCII码
ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。比较EBCDIC。其中95个字符可以显示。另外33个不可以显示。 标准ASCII码为7位,扩充为8位。
美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符
从描述可以看出(ASCII码)表示 ,只是对西文字符的一个集合. [a-z][A-Z] ,其中包括95个可见字符.和33个不可见字符. 不可见字符如 “\t:9:,”\n:10”,”\r:13” 可见字符如 “A: 65”,”0:48”
以A为例 其 字符编码表 内容如下: A 65 41 65就是A的ASCII码的值.41代表65的16进制结果.
GB2312编码
但是伟大的中国人来了.拿汉语来说.比较常见的新华字典中出现的汉字就有10000多个.
1990年出版的《辞海》有14872个汉字;1716年编撰的《康熙字典》有47035个汉字;郭沫若生前曾根据日本朋友的估计,我国大约有60000多个 汉字.
从这里可以看出以现在的编码形式一个char可以表示65535个数字..连中国的汉字都放下也刚刚好.所以有些生僻字.电脑打不出来是情有可原.罪有可赦的呵呵.
于是聪明的我们或者他们.
中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码.(GB是国标的意思.很土吧.呵呵)
最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980.
也就是我们现在常用的GB2312.
GB 2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。
由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312字符的排列分布情况见表1-4。
表1-4 GB2312 字符编码分布表
分区范围 | 符号类型 |
第01区 | 中文标点、数学符号以及一些特殊字符 |
第02区 | 各种各样的数学序号 |
第03区 | 全角西文字符 |
第04区 | 日文平假名 |
第05区 | 日文片假名 |
第06区 | 希腊字母表 |
第07区 | 俄文字母表 |
第08区 | 中文拼音字母表 |
第09区 | 制表符号 |
第10-15区 | 无字符 |
第16-55区 | 一级汉字(以拼音字母排序) |
第56-87区 | 二级汉字(以部首笔画排序) |
第88-94区 | 无字符 |
GB2312字符在计算机中存储是以其区位码为基础的,其中汉字的区码和位码分别占一个存储单元,每个汉字占两个存储单元。由于区码和位码的取值范围都是在1-94之间,这样的范围同西文的存储表示冲突。例如汉字‘珀’在GB2312中的区位码为7174,其两字节表示形式为71,74;而两个西文字符‘GJ’的存储码也是71,74。这种冲突将导致在解释编码时到底表示的是一个汉字还是两个西文字符将无法判断。
这也就是一些操作byte来进行汉字操作的程序员经常分出半个汉字的原因了!
GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。当然,中国人在浏览外国网页(比如日文)时,也会出现乱码或无法打开的情况,因为我们的浏览器没有安装日文的编码表。
Big5编码
表1-5 Big5字符编码分布表
编码范围 | 符号类别 |
8140H-A0FEH | 保留(用作造字区) |
A140H-A3BFH | 标点符号、希腊字母及特殊符号 |
A3C0H-A3FEH | 保留(未开放用于造字区) |
A440H-C67EH | 常用汉字(先按笔划,再按部首排序) |
C6A1H-C8FEH | 保留(用作造字区) |
C940H-F9D5H | 非常用汉字(先按笔划,再按部首排序) |
F9D6H-FEFEH | 保留(用作造字区) |
Big5编码的分布如表1-5所示,Big5字符主要部分集中在三个段内:标点符号、希腊字母及特殊符号;常用汉字;非常用汉字。其余部分保留给其他厂商支持。
Big5编码推出后,得到了繁体中文软件厂商的广泛支持,在使用繁体汉字的地区迅速普及使用。目前,Big5编码在*、香港、澳门及其他海外华人中普遍使用,成为了繁体中文编码的事实标准。在互联网中检索繁体中文网站,所打开的网页中,大多都是通过Big5编码产生的文档。
Unicode编码(统一用3个字节)
应为编码方式各自为政.如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。
Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
UTF-8编码(根据编码的长短来自动确定占用空间.)
为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
UTF-8的编码是这样得出来的,以”汉”这个字为例:
“汉”字的Unicode编码是U+00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8编码是E6B189。
Base64编码
有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输, Base64编码这是历史原因造成的(认为只有美国会使用电子邮件?)。因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码。
为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码。
下一篇: mysql 增添、修改、删除字段语法实例