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

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

阅读更多
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字符设备驱动(转载)

    虽然通常情况下字符设备的数据单位是字节,但也可能根据编码规则的不同,如UTF-16,一个字符可能占用两个字节。 字符设备在文件系统中表现为特殊的文件,它们有自己的i节点,文件类型标记表明它们是字符设备文件。...

    (资料大全加程序)C++ 字符串之间的相互转化 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR)

    - `宽字符集----转载 - 游子的博客 - IT博客.mht` 和 `宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR) - 轻轻浪花 - CSDN博客.mht` 这两个文件可能是博客文章的存档,详细讨论了宽字符集的使用和LPTSTR等相关...

    【RPA之家转载视频教程3】将安全字符串转换为字符串--UIPath.rar

    UIPath提供了如“解密字符串”这样的高级活动,可以对接各种加密算法,如AES、RSA等,以解密安全字符串。 其次,视频可能还会涉及自定义脚本的编写。在某些情况下,内置的解密活动可能无法满足特定的加密方式,这时...

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

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

    utf8的编码算法 转载

    UTF-8编码是一种广泛使用的Unicode字符编码方案,其设计目标是高效地存储和传输Unicode字符。在计算机系统中,Unicode字符集提供了一种统一的方式来表示世界上各种语言的字符,包括拉丁字母、希腊字母、汉字、阿拉伯...

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

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

    运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    在编写VBScript脚本时,尤其是当脚本中包含中文字符时,经常会发生编码问题。这通常会导致脚本运行时出现“无效字符”错误。问题的根源在于脚本的编码格式与Windows的默认编码不兼容。在上述描述中,问题出现的原因...

    js提示框-转载+++ js 乱码+++自动提交+滚动图片加载+箭头导航(转载)

    在JavaScript中,处理跨浏览器或跨平台的字符编码时可能会遇到乱码问题,这通常与UTF-8、GBK等编码格式有关。解决方法包括正确设置页面编码、统一数据传输编码以及在读取或写入字符串时使用合适的编码解码函数。 ...

    [转载]彻底解决简繁体软件乱码问题

    字符编码是计算机系统用来表示文本的方式,比如ASCII、GB2312、GBK、Big5和Unicode(UTF-8)等。简体中文通常使用GBK或UTF-8编码,而繁体中文则常使用Big5或UTF-8编码。当软件不支持当前文件或文本的编码时,就可能...

    【python】文件编码/解码

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

    深入分析 Java I/O 的工作机制(转载)

    开发者需要根据实际需求选择合适的流类型,合理利用缓冲和过滤功能,以及关注字符编码问题,才能编写出高效的I/O程序。在实际项目中,理解并熟练运用这些知识点对于优化程序性能和解决各种I/O问题至关重要。

    MIME学习笔记--转载

    `charset`参数用于指定字符编码,如`ISO-8859-1`、`UTF-8`等。 5. **内容传输编码** - `Content-transfer-encoding: 编码方式`:定义了数据在网络传输时的编码格式。常用的有`7bit`、`8bit`、`binary`、`quoted-...

    javascript中文转拼音(转载)

    1. **字符编码处理**:首先,需要理解Unicode编码,尤其是对于中文字符,它们通常使用UTF-8编码。JavaScript的`String.fromCharCode()`方法可以用来根据Unicode码点创建字符串。 2. **拼音库**:由于JavaScript自身...

    解决网页乱码.zip

    而`setCharacterEncoding()`则专门用于设置请求或响应的字符编码,它需要在读取请求参数之前调用,否则可能无法改变已解析过的参数的编码。 "pageEncoding是指你JSP文件的保存编码,charset是你JSP输入输出的编码在...

    python 字符串只保留汉字的方法

    这个函数接收一个字符串参数,首先将字符串转换成Unicode编码,然后遍历字符串中的每个字符,利用`is_chinese`函数判断每一个字符是否是汉字。如果是汉字,则将其添加到新的字符串`content_str`中。最后返回只包含...

    转载 纯nasm实现中文操作系统.txt

    由于是在纯汇编语言环境下实现中文显示,这涉及到字符编码的处理。在标准ASCII码中无法直接表示中文字符,因此需要使用扩展的字符集或者通过特殊的编码方式来实现中文字符的显示。具体实现方法未在提供的代码片段中...

    webfilter的教程

    `[转载]java web开发中的listener和filter`文件可能会介绍`Listener`,它们是另一种类型的Web组件,监听特定的事件,如会话创建或销毁,然后执行相应的操作。 `javax_servlet_Filter`的使用教程可能深入讨论了`...

    Gtihub上的ML编码器代码

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

Global site tag (gtag.js) - Google Analytics