字符集和字符编码(附c语⾔判断utf8编码)
1.基础知识
1.1.字符集
字符(Character)是各种⽂字和符号的总称,包括各国家⽂字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、
GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
那么为什么会有那么多字符集标准呢?这是因为,很多规范和标准在最初制定时并没有意识到这将会是以后全球普适的准则,或者出于组织本⾝利益考虑想从本质上区别于现有标准。于是,就产⽣了那么多具有相同效果但⼜互不兼容的标准。
1.2.字符编码
字符编码(Character encoding),是把字符集中的字符,编码为指定集合中某⼀对象,以便在计算机中存储和通过⽹络的传递。
⼀般⽽⾔,会直接将字符在字符集中的位置,或者说是码点(code point),作为编码后的值。故⽽,“字符集”和“字符编码”⼆者是紧密耦合的。因此,某种字符集也可以说成是某种字符编码⽅式,例如,当我们说到“ASCII”时,既可以指代ASCII字符集,也可以指代ASCII编码。
2.常⽤字符集&字符编码
2.1.ASCII
ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于基础拉丁字符的⼀套编码系统。它主要⽤于显⽰现代英语。
ASCII⽤7bit来编码字符,共128个码位,由于计算机1个字节是8bit,所以最⾼位为0,即00000000-01111111(0x00-0x7F)。其中有95(⼗进制32-126)个可打印字符,包括常⽤的字母、数字、标点符号等,另外还有33(⼗进制0-31及127)个控制字符。ASCII 字符编码对应规则如下:
ASCII是美国⼈设计的,只能⽀持基础拉丁字符,但是欧洲不只是⽤基础拉丁字符的国家该怎么办呢?最简单的办法就是将ASCII没有⽤到的第8位也⽤上,这样能表达的字符个数就达到了256个,相较原来,增长了⼀倍, 这就是EASCII。EASCII基本解决了整个西欧的字符编码问题。但是对于欧洲其它地⽅如北欧,东欧地区,256个字符还是不够⽤,因此出现了ISO 8859。为解决256个字符不够⽤的问
题,ISO 8859采取的不再是单个独⽴的编码规则,⽽是由⼀系列的字符集(共15个)所组成,分别称为ISO 8859-n(n=1,2,3…11,13…16,没有12)。其每个字符集对应不同的语⾔,如ISO 8859-1对应西
欧语⾔,ISO 8859-2对应中欧语⾔等。EASCII字符编码对应规则如下:(含表格符号、计算符号、希腊字母和特殊的拉丁符号等)
2.2.中⽂编码
为了扩充ASCII,以⽤于显⽰本国的语⾔,不同的国家和地区制定了不同的标准,由此产⽣了GB2312(简体中⽂),BIG5(繁体中⽂),JIS(⽇⽂)等各⾃的编码标准。
2.2.1.GB2312
为了满⾜国内在计算机中使⽤汉字的需要,中国国家标准总局发布了⼀系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换⽤汉字编码字符集·基本集》,标准号为GB 2312-1980。GB2312通⾏于我国内地,新加坡等地也采⽤此编码标准,并且⼏乎所有的中⽂系统和国际化的软件都⽀持GB2312。
GB2312是⼀个简体中⽂字符集,收录简化汉字及⼀般符号、序号、数字、拉丁字母、⽇⽂假名、希腊字母、俄⽂字母、汉语拼⾳符号、汉语注⾳字母,共 7445 个图形字符。其中包括6763个汉字,含⼀级汉字3755个,⼆级汉字3008个;包括拉丁字母、希腊字母、⽇⽂平假名及⽚假名字母、俄语西⾥尔字母在内的682个全⾓字符。GB2312对所收录字符进⾏了“分区”处理,共94个区,区从1(⼗进制)开始,⼀直到94(⼗进制),每区含有94个位,位从1(⼗进制)开始,⼀直到94(⼗进制),共8836(94 * 94)个码位。由此,每个字符都能到其唯⼀对应的区位和码位,这种表⽰⽅式也称为区位码。各区具体说明如下:
101-09区收录除汉字外的682个字符,有164个空位(9 * 94 - 682)
210-15区为空⽩区,没有使⽤
316-55区收录3755个⼀级汉字(简体),按拼⾳排序
456-87区收录3008个⼆级汉字(简体),按部⾸/笔画排序
588-94区为空⽩区,没有使⽤
GB2312以区位码为基础,对字符采⽤双字节编码,其中⾼字节表⽰区码,低字节表⽰位码。由于区码和位码的取值范围均在1-94之间,此范围同ASCII的编码范围冲突。例如汉字‘珀’在GB2312中的区位码为7174(⼗进制),其双字节表⽰形式为71、74;⽽两个ASCII 字符‘GJ’的存储码也是71、74,这种冲突将导致解码时的混乱。为解决这个问题,GB2312将区位码均加上0xA0,这样⾼低字节的第8位都变成了1,进⽽同ASCII区分开来。具体操作如下图:
例如,‘李’字的区位码为3278(表⽰在32区,78位),按照上图步骤获取其GB2312编码:
1、将32(区)转化为⼗六进制为20;
2、加上A0为C0;
3、将78(位)转化为⼗六进制为4E;
4、加上A0为EE;
5、组合区和位,为C0EE;
6、得到'李'字的GB2312编码为C0EE。
所以说,GB2312是兼容ASCII的⼀种编码⽅式:⼀个⼩于127的字符的意义与原来相同,但两个⼤于127的字符连在⼀起时,就表⽰⼀个汉字,前⾯的⼀个字节(⾼字节)范围从0xA1到0xF7,后⾯⼀个字节(低字节)范围从0xA1到0xFE,这样我们就可以组合出7000多个简体汉字了。在这些编码⾥,还把数学符号、罗马希腊的 字母、⽇⽂的假名们都编进去了,连在ASCII⾥本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全⾓”字符,⽽原来在127以下的那些就叫”半⾓”字符了。
有⼈可能曾困惑过:GB2312采⽤双字节编码,原则上来说共有65536个码位,为何实际却只收录字符
7445个?现在,我想答案应该是显⽽易见的:出于兼容ASCII和节省存储容量的考虑,GB2112的双字节编码是变长的,有些字符是单字节表⽰,如ASCII字符,有些字符是双字节表⽰,如汉字,由此⽽来的代价就是损失⼀部分码位;⽽且,编码的设计也并⾮想象的那样,所有字符从头到尾布满整个⼆维表,其中还预留有⼀部分空间以作他⽤。
GB2312的出现,基本满⾜了汉字的计算机处理需要,它所收录的汉字已经覆盖中国⼤陆99.75%的使⽤频率。然⽽,对于⼈名、古汉语等⽅⾯出现的罕⽤字,GB2312却不能处理,这就导致了后来GBK及GB18030的出现。
2.2.2.BIG5
在台湾、⾹港与澳门地区,使⽤的是繁体中⽂字符集。⽽1980年发布的GB2312⾯向简体中⽂字符集,并不⽀持繁体汉字。在这些使⽤繁体中⽂字符集的地区,⼀度出现过很多不同⼚商提出的字符集编码,这些编码彼此互不兼容,造成了信息交流的困难。为统⼀繁体字符集编码,1984年,台湾五⼤⼚商宏碁、神通、佳佳、零壹以及⼤众⼀同制定了⼀种繁体中⽂编码⽅案,即Big5,⼜称⼤五码。
⼤五码是⼀种繁体中⽂汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母及特殊符号。⼤五码采⽤双字节编码,第1字节范围0x81-0xFE,避开了同ASCII码的冲突,第2字节范围是0x40-0x7E和0xA1-0xFE。因为Big5的字符编码范围同GB2312存在冲突,所以⼆者并不兼容。Big5字符编
码分布表如下:
编码范围(⼗六进制)符号类别
8140-A0FE保留(⽤作造字区)
A140-A3BF标点符号、希腊字母及特殊符号
A3C0-A3FE保留(未开放⽤于造字区)
A440-C67E常⽤汉字(先按笔划,再按部⾸排序)
C6A1-C8FE保留(⽤作造字区)
C940-F9D5⾮常⽤汉字(先按笔划,再按部⾸排序)
F9D6-FEFE保留(⽤作造字区)
Big5编码推出后,得到了繁体中⽂软件⼚商的⼴泛⽀持,在使⽤繁体汉字的地区迅速普及使⽤。⽬前,Big5编码在台湾、⾹港、澳门及其他海外华⼈中普遍使⽤,成为了繁体中⽂编码的事实标准。在互联⽹中检索繁体中⽂⽹站,所打开的⽹页中,⼤多都是通过Big5编码产⽣的⽂档。
不过,尽管Big5码内包含⼀万多个字符,但是没有考虑社会上流通的⼈名、地名⽤字、⽅⾔⽤字、化学及⽣物科等⽤字,也没有包含⽇⽂平假名及⽚假名字母。
2.2.
url编码和utf8区别3.GBK
GBK即汉字内码扩展规范,K为扩展的汉语拼⾳中“扩”字的声母。英⽂全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,是对GB2312-80的扩展,简、繁体字融于⼀库。GBK采⽤双字节表⽰,总体编码范围为8140-FEFE,⾸字节在81-FE 之间,尾字节在40-FE 之间。总计23940 个码位,共收⼊21886个字符,其中汉字(包括部⾸和构件)21003 个,图形符号883 个。GBK同样兼容ASCII,00–7F范围内单字节表⽰ASCII字符。
2.2.4.GB18030
GB18030,全称GB18030-2000《信息交换⽤汉字编码字符集基本集的扩充》,是我国政府于2000年3⽉17⽇发布的新的汉字编码国家标准,2001年8⽉31⽇后在中国市场上发布的软件必须符合本标准。
GB18030字符集标准解决了汉字、⽇⽂假名、朝鲜语和中国少数民族⽂字组成的⼤字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中⽂、⽇⽂、朝鲜语
和中国少数民族⽂字。满⾜中国⼤陆、⾹港、台湾、⽇本和韩国等东亚地区信息交换多⽂种、⼤字量、多⽤途、统⼀编码格式的要求。
GB18030标准采⽤单字节、双字节和四字节三种⽅式对字符编码,兼容ASCII、GB2312和GBK。
2.2.5.⼩结
3.Unicode
3.1.Unicode字符集
为什么有Unicode:虽然通过使⽤不同字符集,我们可以在⼀台机器上查阅不同语⾔的⽂档,但是我们仍然⽆法解决⼀个问题:在⼀份⽂档中显⽰世界上所有字符。为了解决这个问题,需要⼀个全⼈类达成共识的巨⼤的字符集,这就是Unicode字符集。
Unicode(中⽂:万国码、国际码、统⼀码、单⼀码)是计算机科学领域⾥的⼀项业界标准。它对世界上⼤部分的⽂字系统进⾏了整理、编码,使得电脑可以⽤更为简单的⽅式来呈现和处理⽂字。
Unicode字符集包含了可能出现的所有字符,每个字符对应⼀个数字,这个数字即码点(Code Point),如字符‘H’的码点为72,字
符‘李’的码点为26446。Unicode包含了1114112个码点,即0x000000-0x10FFFF。世界上所有字符都可以在Unicode字符集中到对应的唯⼀码点。
Unicode按照使⽤上的频繁度将码空间划分为17个平⾯,00-10(⼗六进制,最⾼两位),即从0 - 16(⼗进制),每个平⾯有65536个码点(2^16),其中最重要的是第⼀个Unicode平⾯(码位0x0000-0xFFFF),包含了最常⽤的字符,该平⾯被称为基本多语⾔平⾯(Basic Multilingual Plane),缩写为BMP,其他平⾯称为辅助平⾯(Supplementary Planes),要么是⽤来表⽰⼀些远古时期的⽂字,要么是留作扩展。Unicode字符集中各个平⾯的基本情况如下:
在BMP⾥的所有字符,要⽤4位⼗六进制数(例如U+4AE0,共⽀持六万多个字符);在BMP以外的字符则需要使⽤5位或6位⼗六进制数了。
Unicode只是⼀个字符集,只规定了字符所对应的码点,并没有指定字符编码⽅式,也即从码点到⽤来存储的⽐特流之间如何映射。关于这⼀点,我们不妨回忆⼀下之前曾经讲过的:⼀般⽽⾔,会直接将字符在字符集中的位置,或者说是码点,作为编码后的值。在这种⽅式下,字符集和字符编码耦合紧密,限制了字符集的扩展能⼒。鉴于此,Unicode将字符集和字符编码⽅案分离开,从字符到码点,再从码点到编码值,作了两次映射。这样,虽然每个字符在Unicode字符集中都能到唯⼀确定的码点,但是最终的编码值却是由具体的编码⽅案决定。例如,同样是对字符“A”进⾏编码,UTF-8编码得到的值是0x41,⽽UTF-16(Big-Endian)得到的却是0x0041。
3.2.编码⽅案
Unicode的编码⽅案⼜叫Unicode转换格式,简称为UTF(Unicode Transformation Format),包括UTF-16、UTF-32以及UTF-8,其中⼜属UTF-8使⽤最为⼴泛。
3.2.1.UTF-16
  UTF-16对应于UCS-2,采⽤双字节编码BMP内位于U+0000⾄U+D7FF以及U+E000⾄U+FFFF字符,编码后的值等同于对应的码点;由于BMP内的U+D800⾄U+DFFF码位不对应于任何字符,UTF-16借助于这些码位,根据⼀定的规则,采⽤四字节编码辅助平⾯内位于U+10000⾄U+10FFFF的字符。因此,UTF-16是⼀种变长编码⽅式。
  UTF-16可看成是UCS-2的⽗集。在没有辅助平⾯字符前,UTF-16与UCS-2所指的是同⼀的意思。但当引⼊辅助平⾯字符后,就称为UTF-16了。现在若有软件声称⾃⼰⽀持UCS-2编码,那其实是暗指它不能⽀持在UTF-16中超过2字节的字集。对于⼩于0x10000的UCS码,UTF-16编码就等于UCS码。
  UTF-16编码分⼤端序(Big-Endian,简称UTF-16 BE)和⼩端序(Little-Endian,简称UTF-16 LE)两种,区别在于字节序的不同。例如,汉字“奎”的Unicode码点是594E,“⼄”的Unicode码点是4E59。如果我们收到UTF-16字节流“594E”,那么这
是“奎”还是“⼄”?UTF-16采⽤BOM(Byte Order Mark,字节序标记)机制来解决这个问题:在Unicod
e中有两个特殊字符,⼀个是U+FEFF,表⽰”ZERO WIDTH NO-BREAK SPACE”;另⼀个是U+FFFE,它在Unicode中是不存在的字符,所以不应该出现在实际传输中。UTF-16在传输字节流前,先传输⼀个BOM,这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
  以下的例⼦有四个字符:U+6731(朱)、U+002C(,)、U+807F(⾀)、U+2A6A5(四个“⿓”组成,⽆法显⽰)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。