3字符编码和字库原理

//字符

1>:字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

 

2>:字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

 

3>:ASCII字符集American Standard Code for Information Interchange美国信息互换标准代码)是基于罗马字母表的一套电脑编码系统。使用7位(bits(一个字节最高位为0表示一个字符,共128字符

 

4>:ASCII扩展字符集(ISO-8859-1字符集):使用8位(bits(一个字节)表示一个字符,共256字符扩展表格符号、计算符号、希腊字母和特殊的拉丁符号。

 

5>:GB2312字符集又称为GB2312-80,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,198151日实施。收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共7445个图形字符。

整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。这个码是唯一的把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。

每个汉字及符号以两个字节来表示。第一个字节称为高位字节(也称区字节),第二个字节称为低位字节(也称位字节)。

高位字节使用了0xA1-0xF7(01-87区的区号加上0xA0)低位字节使用了0xA1-0xFE(01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的高位字节的范围是0xB0-0xF7低位字节的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE

EgGB2312字符集的第一个汉字字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1

 

6>:BIG5字符集:台湾发布的统一繁体字编码使用2个字节表示,表示13053个汉字。高字节从A1F9,低字节从407EA1FE

 

7>:GBK字符集它是GB2312的扩展,加入对繁体字的支持,兼容GB2312使用2个字节表示,可表示21886个字符高字节从81FE,低字节从40FE

 

8>:GB18030字符集它解决了中文、日文、朝鲜语等的编码,兼容GBK。它采用变字节表示(1 ASCII24字节)。可表示27484个文字。1字节007F; 2字节高字节从81FE,低字节从407E80FE4字节第一三字节从81FE,第二四字节从3039

 

9>:Unicode字符集:是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示为世界650种语言进行统一编码。该编码于1990年开始研发,1994年正式公布它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

 

10>:UTF-8 ,UTF-16 UTF-32 编码 Unicode 标准的编码字符集的字符编码方案Unicode的其中一个使用方式。 UTFUnicode Translation Format,即把Unicode转做某种格式的意思。

UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。

UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码;UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。

 

11>:Unicode 编码Unicode 编码系统可分为编码方式和实现方式两个层次。

 

 

//=============================

 

1:字符编码(Character Code)

就是规定用怎样的二进制码来表示字母,数字以及一些专用符号,由于这是一个涉及世界范围内有关信息表示,交换,处理,存储的基本问题,因此都以国家标准或国际标准的形式颁布施行。

 

2ASCII码:

通常的输入输出:在键盘上输入字符 转换成 ASCII码  存储于计算机

计算机中的ASCII码转换成字符再显示到显示器上。

 

 

3:汉字编码:

汉字也是字符,要进行编码后才能被计算机接受,汉字编码目前有国标码,机内码,外码,字形码和混合编码等。

 

 

汉字信息交换码(国标码):是用于汉字信息处理系统之间或者与通信系统之间进行信息交换的汉字代码,简称交换码,它是为使系统,设备之间信息交换时采用统一形式而制定的。

 

1981年发布 GB2312-80 简称国标码,它是为使系统,设备之间信息交换时采用统一的形式而制定的,两个字节存储一个国标码。

汉字输入码:为将汉字输入计算机而编制的代码,称为汉字输入码,也叫外码,如区位码,拼音码,五笔字型,智能ABC码等。”?字,用全拼,输入码为码为“BAO”,用区位码,输入码为“1703”,用五笔字型则为“WKS”

 

汉字内码:在计算机内部对汉字进行存储,处理的汉字代码,它应能满足存储,处理和传输的要求。目前,对应于国标码一个汉字的内码常用2个字节存储,并把每个字节的最高位置“1”作为汉字内码的标识,以免和单字节的AsCII码产生歧义。

汉字的机内码 = 汉字的国标码 + 8080H

 

汉字字型码:汉字字形码,是确定汉字的字形信息数据的,如:点阵代码,轮廓码。

它们均存放在汉字字库中,用于汉字的显示和打印。

 

汉字地址码:汉字地址码是指汉字库(这里主要指整字形的点阵式字库码)中存放汉字字形信息的逻辑地址码。

 

GB2312其编码原则为:汉字用两个字节表示,原则上,两个字节可以表示 256×256=65536 种不同的符号,作为汉字编码表示的基础是可行的。但考虑到汉字编码与其它国际通用编码,如ASCII 西文字符编码的关系,我国国家标准局采用了加以修正的两字节汉字编码方案,只用了两个字节的低7位。这个方案可以容纳 128×128=16384 种不同的汉字,但为了与标准ASCII码兼容,每个字节中都不能再用32个控制功能码和码值为32的空格以及127的操作码。所以每个字节只能有94个编码。这样,双七位实际能够表示的字数是:94×94=8836个。

所有的国标码汉字及符号组成一个9494列的二维代码表中。在此方阵中,每一行称为一个"",每一列称为一个""。这个方阵实际上组成一个有94个区(编号由0194),每个区有94个位(编号由0194)的汉字字符集。每两个字节分别用两位十进制编码,前字节的编码称为区码,后字节的编码称为位码,此即区位码,其中,高两位为区号,低两位为位号。这样区位码可以唯一地确定某一汉字或字符;反之,任何一个汉字或符号都对应一个唯一的区位码,没有重码。如字在二维代码表中处于17区第3位,区位码即为“1703 ”

 

 汉字在计算机内部其内码是唯一的。因为汉字处理系统要保证中西文的兼容,当系统中同时存在ASCII和汉字国标码时,将会产生二义性。例如:有两个字节的内容为30H21H,它既可表示汉字的国标码,又可表示西文“0”“!”ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。

GB码的机内码为二字节长的代码,它是在相应GB码的每个字节最高位上加“1”,即

  汉字机内码=汉字国标码+8080H

  例如,上述字的国标码是3021H,其汉字机内码则是B0A1H

  汉字机内码的基础是汉字国标码

  机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。

汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。

  举例:机内码位BEDF,求区位码?

  有两种解法:1.BEDFH-A0A0H=1E3FH=3063D

2.BEDFH-8080H=3E5FH(国标码),3E5FH-2020H=1E3FH=3063D.

 

 

总结:区位码 进行字符在字库中位置的定位(94*94),国标码 方便字符在网络中传输使用(区位 都加 32 区别Ascii中控制符 ),机内码 字符在计算机中的编码(区位码都加 128 最高位置1区别AscII码)。

 

 

4UTF-8的编码模式:

每个使用UTF-8储存的字符,除了第一个字节外,其馀字节的头两个位元都是以 "10" 开始,使文字处理器能够较快地找出每个字符的开始位置。 左边第一个字节1的个数表示这个字符编码字节的位数

(下面的XX都代表有效位)

0xxxxxxx                                                                        (00-7f)                     
110xxxxx 10xxxxxx                                                          (c0-df)(80-bf)                                     
1110xxxx 10xxxxxx 10xxxxxx                                            (e0-ef)(80-bf)(80-bf)                           
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                               (f0-f7)(80-bf)(80-bf)(80-bf)                   
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx                 (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)           
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx   (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf) 

 

 

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 字符 U+00A9 = 1010 1001 (版权符号? )  UTF-8 里的编码为
     11000010 10101001 = 0xC2 0xA9 
而字符 U+2260 = 0010 0010 0110 0000 (不等于≠) 编码为
     11100010 10001001 10100000 = 0xE2 0x89 0xA0 
这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format.

 

UTF-8最大编码数为Max =2^31 

 

//=============================

字库

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值