`
Josh_Persistence
  • 浏览: 1651827 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

编码简介ASCII、Unicode、 GB2312、GBK、GB18030、BIG5、UTF-8、Base64、MBCS

阅读更多

一、基本概述

字符编码是把字符集中的编码,指定集合中某一对象,以便文本能在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准,但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。

 

二、编码

在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。一般地说,开放的操作系统(LINUX、WINDOWS等)采用ASCII编码,而大型主机系统(MVS、OS/390等)采用EBCDIC编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。

ASCII码使用7位2进制数表示一个字符,这样,7位2进制数可以表示出2的7次方个字符,共128个字符。EBCDIC码使用8位,可以表示出2的8次方个字符,256个字符。

无论是ASCII码还是EBCDIC码,都无法对拥有几万个的汉字进行编码。因为上面已经提过,7位2进制数最多对应上128个字符,8位最多对应上256个字符。

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序而对文本显示有不同的影响。

32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122为26个小写字母,其余为一些标点符号、运算符号等。

三、ASCII

美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。

ASCII码于1961年提出,用于在不同计算机硬件软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。比较EBCDIC。其中95个字符可以显示。另外33个不可以显示。标准ASCII码为7位,扩充为8位。

目前使用最广泛的西文字符集及其编码是ASCII字符集和ASCII码(ASCII是AmericanStandardCodeforInformationInterchange的缩写),它同时也被国际标准化组织(InternationalOrganizationforStandardization,ISO)批准为国际标准。

基本的ASCII字符集共有128个字符,其中有96个可打印字符,包括常用的字母、数字、标点符号等,另外还有32个控制字符。标准ASCII码使用7个二进位对字符进行编码,对应的ISO标准为ISO646标准。下表展示了基本ASCII字符集及其编码:

字母和数字的ASCII码的记忆是非常简单的。我们只要记住了一个字母或数字的ASCII码(例如记住A为65,0的ASCII码为48),知道相应的大小写字母之间差32,就可以推算出其余字母、数字的ASCII码。

虽然标准ASCII码是7位编码,但由于计算机基本处理单位为字节(1byte=8bit),所以一般仍以一个字节来存放一个ASCII字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为0(在数据传输时可用作奇偶校验位)。

由于标准ASCII字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了ISO2022标准,它规定了在保持与ISO646兼容的前提下将ASCII字符集扩充为8位代码的统一方法。ISO陆续制定了一批适用于不同地区的扩充ASCII字符集,每种扩充ASCII字符集分别可以扩充128个字符,这些扩充字符的编码均为高位为1的8位代码(即十进制数128~255),称为扩展ASCII码。

通过了解字符的存储编码,可以解决很多由编码不匹配引起的问题,比如网页乱码、邮件乱码,本文简单扼要地阐明了ASCII编码、EBCDIC编码、GB2312编码、Unicode编码、UTF-8编码、以及Base64编码。

四、MBCS

为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码,又称为"MBCS(Muilti-BytesCharecterSet,多字节字符集)"。在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码,所以在中文windows下要转码成gb2312,gbk只需要把文本保存为ANSI编码即可。不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了unicode码的诞生。

其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。

五、GB2312

GB2312也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集基本集》,标准号为GB2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB2312。

GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312字符的排列分布情况见表1-4。

表1-4GB2312字符编码分布表

分区范围 符号类型
第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。这种冲突将导致在解释编码时到底表示的是一个汉字还是两个西文字符将无法判断。

为避免同西文的存储发生冲突,GB2312字符在进行存储时,通过将原来的每个字节第8bit设置为1同西文加以区别,如果第8bit为0,则表示西文字符,否则表示GB2312中的字符。实际存储时,采用了将区位码的每个字节分别加上A0H(160)的方法转换为存储码,计算机存储规则是此编码的补码,而且是位码在前,区码在后。例如汉字‘啊’的区位码为1601,其存储码为B0A1H,其转换过程为:

区位码 区码转换 位码转换 存储码
1001H 10H+A0H=B0H 01H+A0H=A1H B0A1H

GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。当然,中国人在浏览外国网页(比如日文)时,也会出现乱码或无法打开的情况,因为我们的浏览器没有安装日文的编码表

六、GBK

GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称ChineseInternalCodeSpecification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,1980年由国家标准总局发布。基本集共收入汉字6763个和非汉字图形字符682个,通行于中国大陆。新加坡等地也使用此编码。GBK是对GB2312-80的扩展,也就是CP936字码表(CodePage936)的扩展(之前CP936和GB2312-80一模一样)。

基本简介

GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。

GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE之间,尾字节在40-FE之间,剔除xx7F一条线。总计23940个码位,共收入21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。P-Windows3.2和苹果OS以GB2312为基本汉字编码,Windows95/98则以GBK为基本汉字编码

有些汉字用五笔和拼音都打不出来,如:溙(五笔IDWI),须调出GBK字符集才能打出这个字。极品五笔中可右击输入法图标,设置,属性中选GBK字符集。极点五笔中可点击工具条中相关图标进行转换。

计算公式

码对字库偏移量的计算公式为:

[(GBKH-0xB0)*0x5E+(GBKL-0xA1)]*(汉字离散后每个汉字点阵所占用的字节)

编码方式

字符有一字节和双字节编码,00–7F范围内是一位,和ASCII保持一致,此范围内严格上说有96个字符和32个控制符号。

之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81–FE(也就是不含80和FF),第二字节的一部分领域在40–7E,其他领域在80–FE。

七、Big5

在台湾、香港与澳门地区,使用的是繁体中文字符集。而1980年发布的GB2312面向简体中文字符集,并不支持繁体汉字。在这些使用繁体中文字符集的地区,一度出现过很多不同厂商提出的字符集编码,这些编码彼此互不兼容,造成了信息交流的困难。为统一繁体字符集编码,1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码

大五码是一种繁体中文汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母特殊符号大五码的编码码表直接针对存储而设计,每个字符统一使用两个字节存储表示。第1字节范围81H-FEH,避开了同ASCII码的冲突,第2字节范围是40H-7EH和A1H-FEH。因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同一正文不能对两种字符集的字符同时支持。

Big5编码的分布如表1-5所示,Big5字符主要部分集中在三个段内:标点符号、希腊字母及特殊符号;常用汉字;非常用汉字。其余部分保留给其他厂商支持。

表1-5Big5字符编码分布表

编码范围 符号类别
8140H-A0FEH 保留(用作造字区)
A140H-A3BFH 标点符号,希腊字母及特殊符号
A3C0H-A3FEH 保留(未开放用于造字区)
A440H-C67EH 常用汉字(先按笔划,再按部首排序)
C6A1H-C8FEH 保留(用作造字区)
C940H-F9D5H 非常用汉字(先按笔划,再按部首排序)
F9D6H-FEFEH 保留(用作造字区)

Big5编码推出后,得到了繁体中文软件厂商的广泛支持,在使用繁体汉字的地区迅速普及使用。目前,Big5编码在台湾、香港、澳门及其他海外华人中普遍使用,成为了繁体中文编码的事实标准。在互联网中检索繁体中文网站,所打开的网页中,大多都是通过Big5编码产生的文档。

八、Unicode(UTF-16)

如上ANSI编码条例中所述,世界上存在着多种编码方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是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

有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输,这是历史原因造成的(认为只有美国会使用电子邮件?)。因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0,这样收到邮件的人就会发现邮件乱码

为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码。

0
2
分享到:
评论
1 楼 yangsong158 2015-08-10  
支持下,内容比较全面,但不够具体。比如,可以说一下,每个编码的具体规则等。。。。

相关推荐

    多字节与UTF-8、Unicode之间的转换

    2. **UTF-8**:UTF-8是一种可变长度的字符编码,它可以用于编码所有Unicode字符,并且兼容ASCII编码。对于英文等使用较少字节就能表示的文字,UTF-8非常高效。 3. **Unicode**:Unicode是一种标准,旨在为世界上所有...

    C++各种编码转换 Unicode UTF8

    根据提供的文件信息,本文将详细解释C++中几种常见的字符编码转换方法,特别是涉及Unicode与UTF-8之间的转换。在实际开发过程中,由于不同的系统、软件可能会采用不同的字符编码方式来存储文本数据,因此实现不同...

    node-unzip-mbcs:解压缩非UTF8编码,例如cp949,sjis,gbk,euc-kr,euc-jp和gb2312

    按语言划分的主要非UTF8编码: 朝鲜语:cp949,euc-kr 日语:sjis(shift_jis),cp932,euc-jp 中文:gbk,gb18030,gb2312,cp936,hkscs,big5,cp950安装npm install -g unzip-mbcs命令行界面Usage: unzip-mbcs...

    Unicode MBCS字符转换程序.rar

    本项目"Unicode MBCS字符转换程序.rar"专注于解决字符编码的转换问题,包括Unicode16le、Unicode16be、utf-8以及MBCS(多字节字符集)之间的相互转换。下面我们将深入探讨这些编码方式及其转换的原理与实践。 首先...

    unicode编码文档

    随着Unicode的普及,GB2312已被GBK和GB18030等更广泛的字符集所取代,这些字符集在Unicode框架内提供了更多的字符支持。 总的来说,Unicode编码是现代计算机处理多语言文本的基础,它的存在使得不同语言和文化之间...

    MBCS编码和UNICODE编码的相互转换.pdf

    它允许一个字符由1到多个字节表示,通常在ASCII编码的基础上扩展,比如GB2312编码,每个中文字符由2个字节表示。在VC6中,默认使用MBCS编码,因此在处理非ASCII字符时需要考虑多字节序列。 Unicode编码,是一种国际...

    计算机字符编码.pdf

    1. ANSI、GBK和UTF-8:在Windows系统中,ANSI编码通常指的是GBK或GB2312,GBK是中文字符集,UTF-8无BOM是一种广泛使用的编码格式。BOM(Byte Order Mark)是UTF-8、Unicode大端模式和小端模式文件开头的几个非字符...

    MBCS编码和UNICODE编码的相互转换.docx

    MBCS,通常指的是多字节字符集,如GBK或GB2312,其中每个中文字符可能由1到4个字节表示。UNICODE编码则是一种统一的编码标准,它使用固定宽度的字节来表示所有字符,通常是UTF-16,每个字符占2或4个字节。 在...

    Utf8ToCString

    UTF-8是一种广泛使用的Unicode编码方式,它可以表示Unicode字符集中的所有字符。而在Windows CE(WCE)平台上,以及Visual Studio 2005(VS2005)这样的开发环境中,与UTF-8进行交互可能会有一些特定的挑战。"Utf8...

    unicode 转GB

    - **GB编码**:是中国国家标准汉字编码方案的一种,主要包括GB2312、GBK、GB18030等。GB2312是最基本的标准,收录了大约7000个常用汉字及符号;GBK在其基础上进行了扩展,增加了对繁体汉字的支持;GB18030则进一步...

    升级VC6源码mbcs转unicode

    MBCS(Multi-Byte Character Set)则是一种变长字符编码,用于表示非ASCII字符集,比如简体中文GB2312或繁体中文BIG5。 - 在VC6中,默认使用MBCS,而在更新的版本中,更倾向于使用UNICODE,因为UNICODE提供更好的跨...

    Unicode编码源代码

    - **UTF-8、UTF-16和UTF-32**: UTF-8是最常用的Unicode变体,它以可变长度的方式编码字符,从1到4个字节不等。UTF-16则通常用2个字节表示字符,对于UCS-2范围内的字符与UCS-2相同,而超出的字符使用4个字节。UTF-32...

    谈谈Python编码问题和U.ppt

    随着全球化的发展,多字节字符集(MBCS)如CP963、GBK、GB2312和BIG5等应运而生,以适应不同地区的文字需求。然而,MBCS编码各有特点,互不兼容,导致了编码转换的问题。 Python中,`str`对象用于存储ASCII字符串和...

    VCB API UCS 与UTF编码转换

    UTF-8是网络上最普遍使用的编码,因为它对ASCII字符使用单字节,与其他编码兼容性好。UTF-16则常用于内存和存储,因为它是UCS-2的变体,能直接处理BMP内的所有字符。UTF-32则对应UCS-4,为每个字符分配固定长度的32...

    utf8 宽字节 mbcs 随意转换

    utf8 宽字节 mbcs 随意转换 vtString WStringToUTF8(const wchar_t* wstring); vtString2 UTF8ToWString(const char *string_utf8); vtString WStringToMBCS(const wchar_t* wstring); vtString2 MBCSToWString...

    VC中编码转换大全

    这两个函数都需要指定源编码格式,例如GBK、GB2312或UTF-8等。 此外,VC提供了一些内置的字符串类,如`CString`,它支持多种编码间的转换。`CString`提供了`MakeLower`、`MakeUpper`等操作,并且有`...

    易语言ANSI+UTF-8解码源码-易语言

    5. **多字节字符集(MBCS)和宽字符集(WCS)**:ANSI编码属于MBCS,而UTF-16则是一种常见的宽字符集。了解这两种字符集的特点和转换规则,有助于编写更健壮的解码程序。 通过学习和理解这个源码,开发者不仅可以...

    易语言Ansi与Unicode转换源码.7z

    在Windows系统中,Ansi编码通常是基于系统的默认代码页,如GBK或GB2312等,这些编码方式只适用于表示特定语言的字符集,对于多语言环境可能会出现乱码问题。 Unicode,全称统一码,是一种国际标准,旨在为世界上...

    VC MFC 汉字转国标码

    - 汉字编码是为了在计算机中存储和处理汉字而设计的,常见的有GB2312、GBK、GB18030和Unicode(UTF-8)等。 - GB2312是最早的国标码,包含了6763个常用汉字,主要应用于早期的简体中文系统。 3. **汉字转国标码的...

    VS2008在Unicode环境下将Unicode文本转为ANSI文本

    相比之下,ANSI(通常指的是Windows API中的“MBCS”,即多字节字符集)是基于特定区域设置的编码,它主要适用于英语和其他少数欧洲语言,使用8位编码来表示字符。 在VS2008中进行Unicode到ANSI的转换,通常涉及...

Global site tag (gtag.js) - Google Analytics