`
wmj2003
  • 浏览: 97031 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

各种字符编码介绍 (网上转载)

阅读更多
1. ASCII

我们需要了解的最早编码是ASCII码。它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来。如果你技艺高超,可以将该位用做自己离奇的目的:WordStar中那个发暗的灯泡实际上设置这个高位,以指示一个单词中的最后一个字母,同时这也宣示了WordStar只能用于英语文本。
  由于字节有多达8位的空间,因此许多人在想:“呀!我们可以把128~255之间的编码用做个人的应用目的。”问题在于,同时产生这种想法的人相当多,而且在128~255之间的各个位置上应该存放什么这一问题上,真是仁者见仁智者见智。事实上,只要人们开始在美国以外的地方购买计算机,那么各种各样的不同OEM字符集都会进入规划设计行列,并且各人都会根据自己的需要使用高位的128个字符。如此一来,甚至在同语种的文档之间就不容易实现互换。ASCII可被扩展,最优秀的扩展方案是ISO8859-1,通常称之为Latin-1。Latin-1包括了足够的附加字符集来写基本的西欧语言。
最后,这个人人参与的OEM终于以ANSI标准的形式形成文件。在ANSI标准中,每个人都认同如何使用低端的128个编码,这与ASCII相当一致。不过,根据所在国籍的不同,处理编码128以上的字符有许多不同的方式。这些不同的系统称为代码页。
  同时,甚至更为令人头疼的事情正在逐步上演,亚洲国家的字符表有成千上万个字符,这样的字符表是用8位二进制无法表示的。该问题的解决通常有赖于称为DBCS(doublebyte character set,双字节字符集)的繁杂字符系统。
  不过,仍然需要指出一点,多数人还是姑且认为一个字节就是一个字符,以及一个字符就是8个二进制位,并且只要确保不将字符串从一台计算机移植到另一台计算机,或者说一种以上的语言,那么这几乎总是可以凑合。当然,只要一进入Internet,从一台计算机向另一台计算机移植字符串就成为家常便饭了,而各种复杂状况也随之呈现出来。令人欣慰的是,Unicode随即问世了。


2.iso8859-1

属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母'a'的编码为0x61=97。
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6d0 cec4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4b8 ad e6 96 87"。很明显,这种表示方法还需要以另一种编码为基础。

3.GB码

全称是GB2312-80《信息交换用汉字编码字符集基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows95/98则以GBK为基本汉字编码、但兼容支持GB2312。
双字节编码
范围:A1A1~FEFE
A1-A9:符号区,包含682个符号
B0-F7:汉字区,包含6763个汉字


4.GB2312

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312-80中共收录了7545个字符,用两个字节编码一个字符。每个字符最高位为0。GB2312-80编码简称国标码。

  GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。


5.GB12345-90

1990年制定了繁体字的编码标准GB12345-90《信息交换用汉字编码字符集第一辅助集》,目的在于规范必须使用繁体字的各种场合,以及古籍整理等。该标准共收录6866个汉字(比GB2312多103个字,其它厂商的字库大多不包括这些字),纯繁体的字大概有2200余个。
双字节编码
范围:A1A1~FEFE
A1-A9:符号区,增加竖排符号
B0-F9:汉字区,包含6866个汉字


6.GBK

GBK编码(Chinese Internal CodeSpecification)是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。Windows95/98简体中文版的字库表层编码就采用的是GBK,通过GBK与UCS之间一一对应的码表与底层字库联系。
英文名:ChineseInternal Code Specification
中文名:汉字内码扩展规范1.0版
双字节编码,GB2312-80的扩充,在码位上和GB2312-80兼容
范围:8140~FEFE(剔除xx7F)共23940个码位
包含21003个汉字,包含了ISO/IEC10646-1中的全部中日韩汉字


7.BIG5编码

是目前台湾、香港地区普遍使用的一种繁体汉字的编码标准,包括440个符号,一级汉字5401个、二级汉字7652个,共计13060个汉字。BIG5又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁(Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众(FIC)创立,故称大五码。Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBMPS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。

Big5字符集共收录13,053个中文字,该字符集在中国台湾使用。耐人寻味的是该字符集重复地收录了两个相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

尽管Big5码内包含一万多个字符,但是没有考虑社会上流通的人名、地名用字、方言用字、化学及生物科等用字,没有包含日文平假名及片假字母。

例如台湾视“着”为“著”的异体字,故没有收录“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常见的人名用字(如“堃”、“煊”、“栢”、“喆”等)也没有收录到Big5之中。



8.UTF-8

UTF:UCSTransformationFormat.考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。

UTF8编码后的大小是不一定,例如一个英文字母"a"和 一个汉字"好",编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!编码的方法是从低位到高位。黄色为标志位其它着色为了显示其,编码后的位置。


9.Unicode

Unicode字符集(简称为UCS),国际标准组织于1984年4月成立ISO/IECJTC1/SC2/WG2工作组,针对各国文字、符号进行统一性编码。1991年美国跨国公司成立UnicodeConsortium,并于1991年10月与WG2达成协议,采用同一编码字集。目前Unicode是采用16位编码体系,其字符集内容与ISO10646的BMP(BasicMultilingual Plane)相同。Unicode于1992年6月通过DIS(DrafInternationalStandard),目前版本V2.0于1996公布,内容包含符号6811个,汉字20902个,韩文拼音11172个,造字区6400个,保留20249个,共计65534个。Unicode编码后的大小是一样的.例如一个英文字母"a" 和 一个汉字"好",编码后都是占用的空间大小是一样的,都是两个字节!

Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母'a'为"0061"。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。

1.国家标准汉字代码体系
汉字字数繁多,属性丰富,因而汉字代码体系也较复杂,包括:
(1)汉字机内码。它们是汉字在计算机汉字系统内部的表示方法,是计算机汉字系统的基础代码。
(2)汉字交换码。它们是国标汉字(如机内码)进行信息交换的代码标准。
(3)汉字输入码。它们是在计算机标准键盘上输入汉字用到的各种代码体系。
(4)汉字点阵码。它们是在计算机屏幕上显示和在打印机上打印输出汉字的代码体系。
(5)汉字字形控制码。为了打印各种风格的字体和字形所制定的代码。
这些代码系统有的必须有统一的国家标准,有的则不要求统一。近年来我国已经制定系列汉字信息处理方面的国家标准,今后将继续完善,并与国际上求得统一。

2. 国家标准汉字交换码
我国制定了“中华人民共和国国家标准信息交换汉字编码”,标准代号为GB2312—80,这种编码又称为国标码。在国标码的字符集中共收录了一级汉字3755个,二级汉字3008个,图形符号682个,三项字符总计7445个。
在国标GD2312—80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,方阵的每一行称为一个“区”,编号为01区到94区,每一列称为一个“位”,编号为01位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。汉字“母”字的区位码是3624,表明它在方阵的36区24位,问号“?”的区位码为0331,则它在03区3l位。
所有的汉字和符号所在的区分为以下四个组:
(1)01区到15区。图形符号区,其中01区到09区为标准符号区,10区到15区为自定义符号区。
01区到09区的具体内容如下;
1)01区。一般符号202个,如间隔符、标点、运算符、单位符号及制表符;
2)02区。序号60个,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
3)03区。数字22个,如0—9及X一XII,英文字母52个,其中大写A—Z、小写a—z各26个;
4)04区。日文平假名83个;
5)05区。日文片假名86个;
6)06区。希腊字母48个;
7)07区。俄文字母66个;
8)08区。汉语拼音符号a—z26个;
9)09区。汉语拼音字母37个。
(2)16区到55区。一级常用汉字区,包括了3755个一统汉字。这40个区中的汉字是按汉语拼音排序的,同音字按笔划顺序排序。其中55区的90一94位未定义汉字。
(3)56区到87区。二级汉字区,包括了3008个二级汉字,按部首排序。
(4)88区到94区。自定义汉字区。
第10区到第15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自行定义国标码中未定义的符号和汉字。

3. 国家标准汉字机内码
汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上所述,汉字区位码的区码和位码的取值均在1~94之间,如直接用区位码作为机内码,就会与基本ASCII码混淆。为了避免机内码与基本ASCII码的冲突,需要避开基本ASCII码中的控制码(00H~1FH),还需与基本ASCII码中的字符相区别。为了实现这两点,可以先在区码和位码分别加上20H,在此基础上再加80H(此处“H”表示前两位数字为十六进制数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别 称为高位字节和低位字节,这两位字节的机内码按如下规则表示:
高位字节=区码+20H+80H(或区码+A0H)
低位字节=位码+20H+80H(或位码+AOH)
由于汉字的区码与位码的取值范围的十六进制数均为01H~5EH(即十进制的01~94), 所以汉字的高位字节与低位字节的取值范围则为A1H~FEH(即十进制的161~254)。
例如,汉字“啊”的区位码为1601,区码和位码分别用十六进制表示即为1001H,它的机内码的高位字节为B0H,低位字节为A1H,机内码就是B0A1H。

4. 汉字的输入码
在计算机标准键盘上,汉字的输入和西文的输入有很大的不同。西文的输入,击一次键就直接输入了相应的字符或代码,“键入”和“输入”是同一个含义。但是在计算机上进行汉字输入时,“键入”是指击键的动作即键盘操作的过程,而“输入”则是把所需的汉字或字符送到指定的地方,是键盘操作的目的。目前已有多种汉字输入方法,因此就有多种汉字输入码。汉字输入码是面向输入者的,使用不同的输入码其操作过程不同,但是得到的结果是一样的。不管采用何种输入方法,所有输入的汉字都以机内码的形式存储在介质中,而在进行汉字传输时,又都以交换码的形式发送和接收。
国标GB2312—80规定的区位码和沿用多年的电报码都可以作为输入码。这类汉字编码和输入码是一一对应的,具有标准的性质,它们编码用的字符是10个阿拉伯数字,每个汉字的码长均为等长的四个数码。
其他编码的种类很多,可从以下几点加以讨论:
(2)编码类型。可分为拼音码、字形码、音形结合码等类型。
(2)编码规则。不同的编码方案有很大的不同,有的规则简单,学习起来较容易记忆,‘有的规则复杂,较难记亿。
(3)编码字符集。有用字母键的,有用数字键的,有用字母键加数字键的,或者用了更多的键作编码字符集的。
(4)编码长度。它与编码字符集的大小有关,字符集越大,编码长度越短。采用26 个字母的编码,其码长一般为四位。
(5)对应关系。除上面提到的区位码和电报码为一一对应的无重码编码外,其他现有的编码方案均有一定数量的重码。所谓重码即一码对应多字。有许多编码为了增加输入的灵活性,同一汉字用多个码来对应,例如双音编码。
(6)单宁和词汇的编码。现有的编码方案,为了提高效率,除了单字外还规定了词汇的编码,甚至使用者可以自行增加词汇库中的词汇,但在提高效率的同时也增加了记亿和操作的复杂性。
(7)码表的类型和大小。从汉字输入码到机内码的转换一股需要在机内检索码表。如果输入码和机内码存在简单的函数关系,有公式可以计算,如区位码等编码就不需要码表,其他没有简单函数关系的编码就需要码表。码表大小与数据结构、单字数量、词汇数量等因素有关。国标血2312—80规定的6763个一、二级汉字,备类编码的码表从几千字节到几万字节。随着词汇旦的增加,有的码表达到了若干兆字节。

5. 汉字的点阵码
汉字的显示和输出,普遍采用点阵方法。由于汉字数量多且字形变化大,对不同字形汉字的输出,就有不同的点阵字形。所谓汉字的点阵码,就是汉字点阵字形的代码。存储在介质中的全部汉字的点阵码又称为字库。 .
16x16点阵的汉字其点阵有16行,每一行上有16个点。如果每一个点用一个二进制位来表示,则每一行有16个二进制位,需用两个字节来存放每一行上的16个点,并且规定其点阵中二进制位0为白点,1为黑点,这样一个16X16点阵的汉字需要用2×t6即32个字节来存放。依次类推,24×24点阵和32×32点阵的汉字则依次要用72个字节和128个字节存放一个汉字,构成它在字库中的字模信息。
要显示或打印输出一个汉字时,计算机汉字系统根据该汉字的机内码找出其字模信息在字库中的位置,再取出其字模信息作为字形在屏幕上显示或在打印机上打印输出。

分享到:
评论

相关推荐

    Linux字符设备驱动(转载)

    请注意,以字符为单位并不一定意味着是以字节为单位,因为有的编码规则规定,1个字符占16比特,合2个字节。  在UNIX系统中,字符设备以特别文件方式在文件目录树中占据位置并拥有相应的i结点。i结点中的文件类型...

    字库,字库下载和显示多个汉字和字符.zip

    点阵库只要按照这个编码规则从0X81开始,逐一建立每个区,每个区的点阵大小为每个汉字所用字节数*190。 假定GBKH和GBKL分别代表GBK的第一个字节和第二个字节(高位和低位),size代表汉字字体的大小,Hp代表对应...

    Huffman编码的C++实现

    Huffman编码的C++实现 转载自: http://blog.chinaunix.net/uid-20546521-id-1927625.html

    utf8的编码算法 转载

    其实可以这么理解,unicode字符集是一张巨大的表格,把世界上各种语言的字符和标点符号都编排到里面,然后按照一定的顺序给每个字符排号(很遗憾的是对于中文来说,这个顺序不是按照汉语拼音的顺序)。有了这张巨大...

    随波逐流CTF编码工具 V4.9 20230711转载

    由随波逐编写开发,CTF编码工具为用户提供丰富的离线加密解密功能,还可以对字符编码进行转换,文件隐写查看,用户可以根据自己的需求来使用功能,非常实用,能够提高大家的工作效率!

    【python】文件编码/解码

    一、编码介绍 ASCII  ASCII码是西欧编码的方式,采取7位编码,所以是2^7=128,共可以表示128个字符,包括34个字符,(如换行LF,回车CR等),其余94位为英文字母和标点符号及运算符号等。GB2321  GB2312 是对 ASCII...

    Gtihub上的ML编码器代码

    从github上转载的,向作者致意,以下是readme.md # Machine-Learning 关于 机器 / 深度 学习的内容 ### 目录 #### 1. KNN基于向量空间搜索的手写字符识别 博客的连接: ...

    GBK_UTF8批量文件转码工具

    (转载)GBK编码的文件和UTF8编码方式的转换,支持批量转换。当eclipse编码方式为GBK,其中包含中文的注释,这个工具适合批量转换成UTF编码

    ASP实现GB2312字符与区位码的相互转换的代码

    研究编码,得知GB2312编码与区位码的关系,尝试之后,得此程序。 搜索,似乎没人写,故发此地。 原创首发: http://bbs.blueidea.com http://mytju.com/classcode/ 任意转载,任意使用。 1.简述 (1)GB2312标准的...

    linux系统vim实验报告.doc

    关于文本编辑器 vim 的使用 【注】里面的内容和自己跟着敲敲,文件名字换成自己的,可以套用我的模板和前言结论,代码最好跟着敲敲,里面的操作步骤我也说的非常明白。...【注】原创文章,请勿转载

    MS1824 Datasheet-EN(1)-已解锁.pdf

    MS1824一款多功能视频处理器,MS1824包含12通道10位视模数转換(ADC)、TV解码器、编码器、三通道10位视频数模转换(DAC)、32位数字输入輸出信号接口及字符型0SD功能。MS1824可处理隔行和逐行模拟视频或者图形输入信号...

    一个改进的UBB类

    <?php /* 如有转载,请注明作者 原作者: 何志强 改进: SonyMusic[ sonymusic@163.net ] 文件: ... 改进功能: 对字符串进行UBB编码,该类目前只支持下列几个简单且实用的编码: 1. URL裢接 [url] http://phpuser.com/

    APKTool批处理版l

    4.保存时的文本编码要设置为ANSI格式,具体操作在菜单栏的“格式”中。打包前确定classes 文件夹下没有其他无用文件,如notepad++的备份文件(为避免这种情况,请确认在菜单栏“设置”—“首选项”—“备份与自动...

    WordPress 博客下载插件Download Monitor

    Download Monitor插件功能介绍: 可以设置下载分类、可以设置只为注册用户下载、在后台管理中排序和分页、支持wordpress2+(包括2.5)、支持重新上传文件,方便更新文件、图象显示模式(在网页中显示一个下载链接...

    leetcode下载-algorithm:算法

    商业转载请联系官方授权,非商业转载请注明出处。 题目:最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设  s 的大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个...

    压缩圣手ZipGhost

    “国华软件”欢迎以介绍软件、提供免费软件下载的站点、平面媒体非赢利附带光盘载体等等自由发布“国华软件”公开发布的全部软件--免费软件及共享软件。但未经许可,任何站点及媒体均不得发布共享软件的注册版、...

    cobaltstrike_release-20210907.7z

    + 添加对用户定义反射加载...版权声明:本文为CSDN博主「a19770310」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/a19770310/article/details/120541758

    IIS服务器SSI(rewrite重写)插件的帮助资料

    运行IIS服务器SSI(rewrite重写)插件,可在windows的IIS服务器上通过“httpd.conf”文件或将指令“Options +Includes”以ASCII编码写入“.htaccess”格式的文件来开启SSI (Server Side Includes)。 任何路径都可以...

    java DATE与时间戳互化

    转载▼ 标签: java 时间戳 date 转换 转化 杂谈 分类: java 1、时间戳的定义  时间戳是指文件属性里的创建、修改、访问时间。 数字时间戳技术是数字签名技术一种变种的应用。在电子商务交易文件中,时间是...

    简单的网页内容采集器(C#)

    然后填写数据库连接字符串,这里是定义了采集到的数据插入到哪个数据库,后面选择表名,不必说了。 <br>网页编码,不出意外的话,中国大陆都可以采用UTF-8 <br>爬取文件名的正则:呵呵 这个工具明显是给...

Global site tag (gtag.js) - Google Analytics