汉字编码知识简述

汉字的计算机编码已经产生并应用了大约20几年,我接触计算机编程大概10年了,汉字编码深入应用并不多,却不可避免。本文目的旨在介绍汉字编码的发展历程,主流汉字编码的基本原理、应用等。
为了方便后面的理解,先列几个名词解释:
ASCII:基本学过计算机的人都知道,不详细解释含义了,他是我们现在应用计算机的主流编码字符集,需要注意的是他的二进制最高位为1时是扩展ASCII码,常用的字母、数字、符号、控制字符等最高位都是0。ASCII实在太常用了,以至于很久一来我都认为他是计算机编码的根本,是其他编码的基础,然而这是错误的,字符集是依赖与硬件的,与之类似的还有其他编码方案,只是不常用,我们用不到而已。
GB2312-80:简体中文汉字编码的第一个标准,是汉字编码的第一个里程碑,具有划时代意义,发布于1980年,一直使用至今。GB编码规定,一个汉字占2个Byte,且每个字节都是扩展ASCII码(事实上,实际定义的空间要比这个小的多,只有六七千个汉字,实际编码定义不做具体分析了)。随着多年的应用,GB编码呈现出最大的问题就是生僻字无法显示,例如我们曾经一位总理的名字“镕”。据说简体中文版的windows3.2就是使用的GB作为汉字内码。
GBK:GB编码的继承人,全面兼容GB编码定义,并扩展增加了大量汉字,收入汉字2万多个,简体中文版的windows95、98就是使用的GBK编码。至此,中国人自己的文字编码基本达到了完善的程度。
Unicode:统一码,万国码,有几个不同的版本,最常用的是每个汉字占2Byte,共65536种编码,收录了世界各国文字,常用符号,数学符号等,Unicode定义,同字型的字符,在Unicode中只有一个编码,例如,“中”简体和繁体的字型是相同的,在GBK和繁体的BIG5中,编码是不同的,但是在unicode中只有一个,据说日本人比较反对此编码,因为Unicode编码认为日文字符是中文字符的变形(异体),因此将日文字符纳入了中文字符中,也就是说unicode中没有日文字符(事实上是有的),那只是特殊中文字的一部分!(强烈支持此种论断!制定unicode的专家一定对中国秦朝或宋朝历史有一定了解)
UCS:Universal Character Set,通用字符集,国际标准化组织制定的ISO-10646标准,OSI总是喜欢出来制定标准,力求世界统一,但经常出现的比较晚,文字编码上也是,UCS的主要目的和Unicode是一样的,把世界所有字符定义到一个字符集中,各种文字混合编辑的时候也不会出现乱码。UCS中需要提到的一个概念是BMP。
BMP:Basic Multilingual Plane,基本多语言面,ISO 10646 定义了一个31 位的字符集。然而,在这巨大的编码空间中,迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD)。这个区域就是BMP
名词就是这些,从这些名词可以看出,汉字编码经历了从无到有,逐步完善,走向世界的过程。看到这里也许会有这样一个疑问,最终世界文字的编码走向统一,为什么会产生Unicode和UCS两套字符集,这岂不是形成了两大阵营?还好,负责这两个标准制定的人,早已意识到这点,他们已经达成共识,两种编码相互兼容,并在以后的扩展中紧密合作。
上面通过这些名词简单介绍了汉字编码的发展历史,那么当前汉字编码主要使用哪种呢?我个人理解,还是GBK居多,但是以后的发展,unicode成为主流可能是迟早的事,下面针对Unicode做进一步描述。

前面说了,当前最常用的Unicode编码占2字节,对应于UCS-2,也就是BMP(我相信,看到这里,可以帮助很多人读懂大量相关资料),理论空间65536个,目前没有定义完,还有空间可以扩展。另外还有UCS-4,每字符4字节,最高位为0,字符编码占用31Bit,目前我们基本用不到。每个字符编码对应一个字型和一个码值,字型就是我们的汉字,而码值,就是内码,是这个汉字在unicode字符集中定义的位置编号,这种关系就如同我们看到“A”就想到码值是0x41。换言之,每个汉字(其实其他字符也一样)保存在内存或磁盘时就是一个0到65535的整数。在unicode编码中任何字符都是2字节的,与传统的GBK编码中中英文混排完全不同,以Unicode保存“A”时,存储的内容是0x0041,而GB、GBK或者ASCII码保存时内容是0x41。这样,直接以Unicode保存英文会浪费空间,所以又引入了一个概念,“实现方式”,Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF),Unicode到UTF-8转换有这样一组对应关系:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
左边两列对应Unicode码值,右边是UTF-8的二进制格式,转换时,将Unicode编码的二进制形式对应填充到UTF-8中的xx部分,右对齐,左边补0。注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值