lovebet爱博体育字符编码笔记(理论篇)字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian

笔录转字符编码的关于事项,这首文章先说说字符编码的有的史与公理。

1、字符编码、内码,顺带介绍汉字编码 

1.ASCII编码与ANSI标准

1字节(1B) = 8比就(8b) = 8只二进制位
1B的信息量 0b00000000 ~ 0b11111111 = 2^8 = 256个状态

标准ASCII编码下1B的后7各项,而首先各默认置0,即:
0b00000000 ~ 0b01111111 = 2^7 = 128个状态
立马128只状态各存储了控制字符、数字、大小写字母和另外标志。详见ASCII编码表[]

日趋地,128只状态不再会满足人们的求,不同国度(语言区)都惦记把好语言的字符编进ASCII编码中,于是人们纷纷自发的使由了1B的另外128个状态,称为扩展ASCII编码,其应用1B的后7各项,同时率先各默认置1,即:
0b10000000 ~ 0b11111111 = 2^7 = 128个状态
由于是自然行为,每个国家(语言区)都指向扩大ASCII编码有谈得来独特之定义,因此彼此之间的恢宏ASCII编码是不可知通用的。(标准ACII编码区仍然通用)

烦还无只是于斯,部分国家(语言区)的字符数量过剩(如字就是十万级别之数据),显然扩展ASCII编码的128单状态不克满足,于是产生矣下面的同样栽编码方式(ANSI标准编码):

  1. 保存标准ASCII编码的128单字符不移,称为半角
  2. 其余的字符用简单独字节来表示,这样理论上能新增256*256=65536个编码,称为全角
    立刻也是豪门最早所认知的底就词话的由来

英文(半角)占一个字节,汉字(全角)占少数只字节

全角字符中用于编码的一定量个字节被称之为高位字节低字节
全角字符 = 高位字节 + 低位字节
高位字节和低字节都得以挑选用三种政策编码:

  1. 标准ASCII编码的128个状态
  2. 扩展ASCII编码的128个状态
  3. 上述且因此的256只状态

不难窥见当就半单字节都应用标准ASCII编码的128只状态时,计算机是无能为力识别这是零星个半较量字符,还是一个全角字符的。因此全角的编码区域实际只有:
256*256 – 128*128 = 49152个
针对此5万个左右之编码区,不同国度(语言区)制定了不同的编码标准,我们耳熟能详的生:

  • GB2312,大陆1980年正式(其中一级汉字3755单,二级汉字3008只,包括拉丁字母、希腊字母、日文平假名及片假名字母、俄报西里尔字母在内的全角字符682个。)
  • GBK,大陆1995年标准(GB2312的扩大,增加不常用汉字与字符,总编码量扩展及23940)
  • BIG-5,台湾规范

  • Unicode编码


乘胜互联网的提高,信息交流变得尤其频繁,这便促使一栽“大一统”的编码方式出现。这种编码可以拿世界上独具的字符都编入其中,且每个状态各与字符都唯一对应。正而她的讳代表的意那样,Unicode编码做到了。
Unicode将编码存储就片个逻辑过程独立开来。

  • 世界上之各国一个字符都产生还仅发生一个Unicode编码方案即:字符S->Unicode(S)
  • 各国一个Unicode码都足以透过的余方案来存储,这些方案的称即使凡咱常常听见的UTF-8、UTF-16、UTF-32等等。

字符必须编码后才会于电脑处理。计算机应用的缺省编码方式就是电脑的内码。早期的电脑应用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。 

2.1 编码逻辑

脚先说一下Unicode的编码方式:
Unicode码的编码范围:0x000000 ~ 0x10FFFF
她的晚四各名叫一个plane:0x0000 ~ 0xFFFF = 2^16 = 65536个状态
面前片员代表plane的号码,一共发生:0x00 ~ 0x10 = 17个plane
就此Unicode编码一共有:17 * 65536 = 1114112个状态
顿时可将世界上所有的字符都编码进去,而且还有老特别的余。同时转忘了,预留的空白plane可远远多给17单(16*16=256个)
实在,在Unicode
5.0本被单单所以到了0,1,2,14,15,16随即几乎只号plane中之238605只状态

GB2312(1980年)一共用了7445只字符,包括6763只字和682独其他符号。汉字区底内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中起5独空位是D7FA-D7FE。 

2.2 存储逻辑

Unicode编码总算是将全球的字符都“装”下了,当然为达到这目的,经过Unicode编码后底字符所占空间变的怪可怜。本来就占一个字节的便ASCII字符和占少数单字节的ANSI字符统统都改为了占据三独字节的Unicode字符,造成了半空中的庞然大物浪费。因此Unicode编码的编码方式囤方分开独立实现,存储传输方案专注于贯彻Unicode编码如何节约存储空间。
广泛的贮存传输方案来:UTF-8,UTF-16,UTF-32等

GB2312支持的汉字太少。1995年之方块字扩展规范GBK1.0引用了21886单记号,它分为汉字区跟图形符号区。汉字区包括21003独字符。2000年之GB18030是代GBK1.0底正统国家标准。该专业收录了27484单汉字,同时还收录了藏文、蒙文、维吾尔文等要的少数民族文字。现在的PC平台要支持GB18030,对嵌入式产品少不作要求。所以手机、MP3一般只有支持GB2312。 

UTF-8方案

UTF-8最酷的一个特性,就是她是同种植变长的存储方。它好下1~4单字节存储一个Unicode码,根据不同之Unicode码而变存储字节的尺寸。
UTF-8的囤规则不行简短,只发第二漫长:

  1. 于小于0x7F的Unicode码,UTF-8编码只来一个字节,字节的第一各类如为0,后面7各项呢Unicode码。这吗是为英语字母的UTF-8编码和通常ASCII码是同之。
  2. 对另外Unicode码,落入下表的照应的界定被。其中x代表空白位,用Unicode码补充。
Unicode符号范围(十六进制) UTF-8存储方式(二进制)
000000 ~ 00007F 0xxxxxxx
000080 ~ 0007FF 110xxxxx 10xxxxxx
000800 ~ 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 ~ 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

自ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即与一个字符在这些方案面临连连发生同样之编码,后面的正儿八经支持更多的字符。在这些编码中,英文和国语好统一地拍卖。区分中文编码的方式是高字节的嵩位不为0。按照程序员的叫做,GB2312、GBK到GB18030都属双字节字符集
(DBCS)。 

UTF-16方案

UTF-16方案吧是一模一样种变长存储方,它采用简单个字节或四个字节来存储Unicode码。
当Unicode码位于编号为00之plane(即0x000000 ~
0x00FFFF之间)时,Unicode码正好对应了点滴单字节(16员二进制)的长。即使用简单独字节顺序存储。
当Unicode码位于其他编号的plane(即0x010000 ~
0x10FFFF)时,Unicode码减去0x10000继刚刚对诺化20个二进制,依次填入以下四个字节的20单空位被:
110110xx xxxxxxxx 110111xx xxxxxxxx
面前片独字节称为高位WORD,以110110初始;后少个字节称为小WORD,以110111开始。

一部分中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是格外不便用到的,通常我们还是用GBK指代中文Windows内码。 

UTF-32方案

UTF-32方案是平栽定长存储方案,它连接以4个字节存储Unicode码,由于Unicode码只出24各类,于是UTF-32方案免针对Unicode码做任何变更直接存储。
有人会咨询,用3单字节不也是好完全存储Unicode的所有编码为?我个人的明白是,由于Unicode的前身:通用字符集(Universal
Character Set,
UCS)分为了2字节编码的UCS-2和4许节编码的UCS-4。为了使编码方案统一,UCS-4承诺不再向0x10FFFF之后编码,并出于UCS-2作为编号为0的plane(Basic
Multilingual Plane, BMP)共同组成Unicode编码。3者之间的涉及吗:
UCS-4编码中0x00000000 ~ 0x0010FFFF的一部分组成了Unicode编码
Unicode编码中0x000000 ~ 0x00FFFF的一对组成了UCS-2编码
因此UTF-16作为UCS-2编码的囤方案,UTF-32作为UCS-4编码的囤方案以4单字节,还是还是保留着。

这边还有局部细节: 

关于字节序(Byte Order Mark, BOM)

以UTF-16和UTF-32中设有着Little endian (LE)和Big endian
(BE)两种植传输字节约流的法子(显然好蛋疼)
为了给机器识别出立即片种植传输方式,在Unicode编码规范中设定了一个称”ZERO
WIDTH NO-BREAK
SPACE”的状态位0x00FEFF,它怪应另实际意义的字符,且连续出现在文件之开,用于标志该文件是使啊点子读取字节流的(LE
or BE)。按照上文三种植存储方案的规则:

编码方案 BOM(十六进制)
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

足见由于UTF-8不存LE或BE的区别,因此她的BOM只发生平等栽,可有可无。所以在UTF-8的方案下,有UTF-8
BOM和UTF-8 无BOM两种,而她的界别仅是文件开始有没发EF BB BF
这三个字节罢了

GB2312的初稿还是区位码,从区位码到内码,需要在高字节和低字节上独家长A0。 

在DBCS中,GB内码的贮存格式始终是big endian,即高位以前边。 

GB2312的鲜个字节的最高位还是1。但称这规则的码位只生128*128=16384只。所以GBK和GB18030的低字节最高位还或无是1。不过这不影响DBCS字符流的分析:在读取DBCS字符流时,只要碰到高位为1之字节,就可拿下零星独字节作为一个双字节编码,而不用无小字节的上位是啊。 

2、Unicode、UCS和UTF 

面前提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只同ASCII兼容(更纯粹地游说,是与ISO-8859-1匹),与GB码不般配。例如“汉”字之Unicode编码是6C49,而GB码是BABA。 

Unicode也是相同种植字符编码方法,不过它们是由国际集团计划,可以容纳全世界享有语言文字的编码方案。Unicode的学名是”Universal
Multiple-Octet Coded Character Set”,简称为UCS。UCS可以用作是”Unicode
Character Set”的缩写。 

依据维基百科的记叙:历史上有个别独拟独立设计Unicode的社,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。ISO开发了ISO
10646路,Unicode协会开发了Unicode项目。 

在1991年左右,双方还认得及世界不待简单个未兼容的字符集。于是它开始集合双方的做事战果,并为创造一个单一编码表而协同工作。从Unicode2.0开,Unicode项目用了和ISO
10646-1等同的字库和字码。 

即个别个档次按照还有,并独立地揭示各自的专业。Unicode协会今天之新星版本是2005年之Unicode
4.1.0。ISO的最新专业是10646-3:2003。 

UCS规定了怎么用几近个字节表示各种文字。怎样传输这些编码,是出于UTF(UCS
Transformation
Format)规范规定之,常见的UTF规范包括UTF-8、UTF-7、UTF-16。 

IETF的RFC2781暨RFC3629以RFC的定位风格,清晰、明快又非错过谨慎地描述了UTF-16和UTF-8的编码方法。我一连记不得IETF是Internet
Engineering Task
Force的缩写。但IETF负责维护的RFC是Internet上所有规范之功底。 

1. ASCII码 

我们了解,在计算机中,所有的信息最终还代表为一个二进制的字符串。每一个二进制位(bit)有0和1鲜种植状态,因此八只二进制位就可以组合有256栽状态,这让名一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同之状态,每一个状态对应一个符号,就是256个号,从0000000到11111111。 

上个世纪60年代,美国制订了千篇一律仿字符编码,对英语字符与二进制位之间的涉嫌,做了统一规定。这叫名ASCII码,一直沿用至今。 

ASCII码一共规定了128只字符的编码,比如空格“SPACE”是32(二迈入制00100000),大写的字母A是65(二前行制01000001)。这128只记(包括32独无克打印出来的主宰符号),只占了一个字节的后面7员,最前方的1位统一规定为0。 

2、非ASCII编码 

英语用128独记编码就足足了,但是就此来表示其余语言,128单标志是不够的。比如,在法语中,字母上方有注音符号,它便无法用ASCII码表示。于是,一些欧洲国家就是控制,利用字节中不了了之的参天位编入新的标志。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国采用的编码体系,可以象征最好多256单记号。 

可,这里又并发了新的问题。不同之国家发生不同之假名,因此,哪怕它还施用256单标志的编码方式,代表的假名却未一样。比如,130以法语编码中意味着了é,在希伯来语编码中却意味着了字母Gimel
(ג),在俄语编码中以见面代表任何一个标志。但是无论如何,所有这些编码方式中,0—127意味着的记号是同样的,不雷同的单是128—255底即时无异截。 

至于亚洲邦之契,使用的符号就又多了,汉字就是差不多上10万左右。一个字节只能表示256种植标志,肯定是不够的,就务须动多独字节表达一个记。比如,简体中文常见的编码方式是GB2312,使用有限单字节表示一个中国字,所以理论及最多好表示256×256=65536独记。 

汉语编码的题材要专文讨论,这首笔记不涉。这里只有指出,虽然都是因此多单字节表示一个记,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。 

3.Unicode 

Unicode的学名是 “Universal   Multiple-Octet   Coded   Character   Set
“,简称也UCS。 现在就此之是UCS-2,即2单字节编码,而UCS-4是为防止将来2独字节不足够用才出之。UCS-2也称之为基本多文种平面。
UCS-2转换到UCS-4只是大概的于头里加2个字节0。
UCS-4则第一用以保存辅助平面

恰好而达到同一省所说,世界上在着又编码方式,同一个二进制数字可以于诠释成不同之记。因此,要惦记打开一个文本文件,就必须了解它的编码方式,否则用错误的编码方式解读,就会见冒出乱码。为什么电子邮件时出现乱码?就是因发信人和收信人使用的编码方式不等同。 

足设想,如果发同栽编码,将世界上富有的符号都纳入其间。每一个标志都给一个举世无双之编码,那么乱码问题便见面化为乌有。这就算是Unicode,就如她的名都代表的,这是平等栽具有符号的编码。 

Unicode当然是一个老大挺之汇聚,Unicode
默认就是 Little Endian 模式
,现在的面足以包容100基本上万独记。每个符号的编码还未均等,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的酷写字母A,U+4E25代表汉字“严”。具体的号子对应表,可以查询unicode.org,或者特别的汉字对应表。 

4. Unicode的问题 

得小心的凡,Unicode只是一个记集,它只是规定了符号的次上前制代码,却尚无确定之二进制代码应该怎么存储。 

按,汉字“严”的unicode是十六迈入制数4E25,转换成二前行制数足足有15各类(100111000100101),也就是说这个符号的表示至少用2只字节。表示其余更要命的号子,可能得3个字节或者4单字节,甚至还多。 

此地虽发出有限独严重的题材,第一个问题是,如何才能够分别unicode和ascii?计算机怎么知道老三个字节表示一个标志,而未是分别表示三只标志为?第二只问题是,我们既清楚,英文字母只所以一个字节表示虽足足了,如果unicode统一规定,每个符号用三只或四独字节表示,那么每个英文字母前还自然发生次至三个字节是0,这对于仓储来说是特大的荒废,文本文件的深浅会为此大出二三倍增,这是无力回天承受之。 

其造成的结果是:1)出现了unicode的多种存储方,也就是说有许多种不同的第二迈入制格式,可以据此来代表unicode。2)unicode在深丰富一段时间内无法推广,直到互联网的面世。 

5.UTF-8 

互联网的普及,强烈要求出现雷同种统一之编码方式。UTF-8就是以互联网上以最普遍的一律种植unicode的兑现方式。其他实现方式还包UTF-16和UTF-32,不过以互联网及着力不用。又雷同尽,这里的关系是,UTF-8凡是Unicode的实现方式有。 

UTF-8最特别的一个特性,就是它是同一种植变长的编码方式。它好下1~4个字节表示一个标志,根据不同的记号而变化字节长度。 

UTF-8的编码规则不行粗略,只发生次修: 

1)对于单字节的符,字节的首先各类如为0,后面7各项也这标记的unicode码。因此对于英语字母,UTF-8编码和ASCII码是同之。 

2)对于n字节的标志(n>1),第一单字节的眼前n位都要为1,第n+1位设为0,后面字节的面前片各一律要为10。剩下的没有提及的二进制位,全部吧夫标记的unicode码。 

下表总结了编码规则,字母x表示可用编码的各类。 

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

脚,还是因汉字“严”为条例,演示如何落实UTF-8编码。 

曾知道“严”的unicode是4E25(100111000100101),根据上表,可以窥见4E25地处第三实行的范围外(0000
0800-0000 FFFF),因此“严”的UTF-8编码需要三独字节,即格式是“1110xxxx
10xxxxxx
10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从晚迈入填入格式中的x,多起底个补0。这样虽赢得了,“严”的UTF-8编码是“11100100
10111000 10100101”,转换成十六进制就是E4B8A5。 

6. Unicode以及UTF-8之间的更换 

经达成等同节约之事例,可以观看“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是勿均等的。它们中的变可以经程序实现。 

每当Windows平台下,有一个无比简易的转折方法,就是运用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中之“另存为”命令,会跳出一个对话框,在无限底部有一个“编码”的下拉条。 

lovebet爱博体育 1

内来四单挑选:ANSI,Unicode,Unicode big endian 和 UTF-8。 

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只对Windows简体中文版,如果是繁体中文版会采用Big5码)。 

2)Unicode编码指的是UCS-2编码方式,即直接用半单字节存入字符的Unicode码。这个选项用之little
endian格式。 

3)Unicode big endian编码与齐一个挑选相呼应。我在生一样节约会分解little
endian和big endian的涵义。 

4)UTF-8编码,也即是齐一样省谈到的编码方法。 

择了”编码方式“后,点击”保存“按钮,文件之编码方式就随即转换好了。 

7. Little endian和Big endian 

上一节曾经关系,Unicode码可以采取UCS-2格式直接存储。以汉字”严“为条例,Unicode码是4E25,需要用鲜只字节存储,一个字节是4E,另一个字节是25。存储的时光,4E于前,25于后,就是Big
endian方式;25当前面,4E在继,就是Little endian方式。 

眼看有限独奇怪的称谓来英国女作家斯威夫就的《格列佛游记》。在该书被,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时到底是从大洋(Big-Endian)敲起还是从小头(Little-Endian)敲起。为了这档子事情,前后爆发了六次于战,一个至尊送了令,另一个皇帝丢了王位。 

从而,第一独字节在前头,就是”大头方式“(Big
endian),第二单字节在前方哪怕是”小头方式“(Little endian)。 

这就是说大当然的,就见面冒出一个题目:计算机怎么亮某一个文本到底以哪一样栽办法编码? 

Unicode规范着定义,每一个文件的极度前方分别进入一个意味着编码顺序的字符,这个字符的讳称为”零涨幅非换行空格“(ZERO
WIDTH NO-BREAK SPACE),用FEFF表示。这刚刚是鲜只字节,而且FF比FE大1。 

万一一个文书文件之头半单字节是FE
FF,就象征该公文采用大头方式;如果头片个字节是FF
FE,就意味着该文件采用小头方式。 

8、UCS-2、UCS-4、BMP 

UCS有一定量种植格式:UCS-2和UCS-4。顾名思义,UCS-2就是故简单只字节编码,UCS-4就是用4独字节(实际上就所以了31各类,最高位必须为0)编码。下面被我们召开有简的数学游戏: 

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。 

UCS-4基于最高位为0的万丈字节分成2^7=128独group。每个group再因次高字节分为256个plane。每个plane根据第3单字节分为256行
(rows),每行包含256只cells。当然跟一行的cells只是最后一个字节不同,其余都同一。 

group 0的plane 0被称作Basic Multilingual Plane,
即BMP。或者说UCS-4中,高点儿独字节为0的码位被称作BMP。 

用UCS-4的BMP去丢前面的片独零字节就赢得了UCS-2。在UCS-2的有数单字节前增长两单零字节,就收获了UCS-4的BMP。而眼前的UCS-4规范被还没其他字符被分配在BMP之外。 

9、UTF的字节序和BOM 

UTF-8因字节为编码单元,没有字节序的题目。UTF-16为零星独字节为编码单元,在分解一个UTF-16文以前,首先要整明白每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们吸纳UTF-16配节流“594E”,那么就是“奎”还是“乙”? 

Unicode规范着推介的标记字节顺序的点子是BOM。BOM不是“Bill Of
Material”的BOM表,而是Byte Order Mark。BOM是一个产生接触小智之想法: 

每当UCS编码中有一个号称”ZERO WIDTH NO-BREAK
SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是免有的字符,所以无应出现在骨子里传输中。UCS规范建议我们在传字节约流前,先污染输字符”ZERO
WIDTH NO-BREAK SPACE”。 

这般只要接收者收到FEFF,就标明是字节流是Big-Endian的;如果接收FFFE,就标志这个字节流是Little-Endian的。因此字符”ZERO
WIDTH NO-BREAK SPACE”又为称呼BOM。 

UTF-8不欲BOM来表明字节顺序,但足用BOM来表明编码方式。字符”ZERO WIDTH
NO-BREAK SPACE”的UTF-8编码是EF BB
BF(读者可据此我们眼前介绍的编码方法验证一下)。所以要接收者收到以EF
BB BF开头的字节流,就知就是UTF-8编码了。 

Windows就是行使BOM来号文本文件之编码方式的。 

10. 实例 

下面,举一个实例。 

开拓”记事本“程序Notepad.exe,新建一个文书文件,内容就是一个”严“字,依次使用ANSI,Unicode,Unicode
big endian 和 UTF-8编码方式保存。 

然后,用文本编辑软件UltraEdit中之”十六进制功能“,观察该文件的里边编码方式。 

1)ANSI:文件的编码就是简单个字节“D1
CF”,这多亏“严”的GB2312编码,这吗暗示GB2312是以大头方式囤的。 

2)Unicode:编码是四只字节“FF FE 25 4E”,其中“FF
FE”表明是小头方式囤,真正的编码是4E25。 

3)Unicode big endian:编码是四只字节“FE FF 4E 25”,其中“FE
FF”表明是大洋方式囤。 

4)UTF-8:编码是六独字节“EF BB BF E4 B8 A5”,前三个字节“EF BB
BF”表示马上是UTF-8编码,后三只“E4B8A5”就是“严”的切实可行编码,它的囤顺序和编码顺序是如出一辙的。 

9. 延长阅读 

* The Absolute Minimum
Every Software Developer Absolutely, Positively Must Know About Unicode
and Character
Sets(关于字符集的极其基本知识) 

* 谈谈Unicode编码 

* RFC3629:UTF-8, a
transformation format of ISO
10646(如果实现UTF-8的确定) 

来源:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 

本文主要参照的素材是 “Short overview of ISO-IEC 10646 and Unicode”
(http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。 

本身还找了少于篇看上去对的资料,不过因自身起来之疑点都找到了答案,所以即便从来不扣留: 

“Understanding Unicode A general introduction to the Unicode Standard”
(http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a) 

“Character set encoding basics Understanding character set encodings and
legacy encodings”
(http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03) 

字符编码:Unicode/UTF-8/UTF-16/UCS/Endian/BMP/BOM

Unicode(Universal Multiple-Octet Coded Character
Set):目前极度盛行和太有前途的字符编码规范,因为它们解决了不同语言编码的扑。 

Uicode由来: 

初的字符编码ascii(8bit,最高位吗0)只能表示128单字符,表示英文、数字与有些记是不曾问题。但是世界相连一种植语言,即以上了高为1之壮大ascii码,也唯有来256只字符。 

针对受到日韩文、阿拉伯文之类复杂的文,就无法使了。 

于是,各国都制订了温馨之兼容ascii编码规范,就是各种ANSI码,比如我国的gb2312,用半个扩大ascii字符来代表一个中文。但是这些ansi码无法同时是,因为她的概念互相重叠,要自由使用不同语言就是务须有一个新编码,为各种文字统一分配编码。 

ISO(国际标准化组织)和Uicode协会(一个软件制造商的协会)分别开始了此工作。即ISO的ISO
10646种及Unicode协会的Unicode项目。后来它们开始统一了双面的劳作成果,采用同一之字库和字码。但眼下简单独品种还在并单独地宣布自己的标准。 

UCS(Unicode Character Set): 

旋即是Uicode在ISO的称呼,目有点儿拟编码方法,UCS-2(Unicode)用2独字节表示一个字符,UCS-4(Unicode-32)用4个字节表示一个字符。UCS-4凡由USC-2扩展来之,增加了2字节底要职。即使是老UCS-2,它也可以象征2^16=65535个字符,基本上可以容纳有常用各国字符,所以时基本都动UCS-2。 

UTF(UCS Transformation Format): 

Unicode以2个字节表示一个字符,ascii使用1单字节,所以于诸多上面来了冲突,以前处理ascii的点子都得重写。而且C语言用\0作为字符串结束标志,但Unicode中广大字符都饱含\0,C语言的字符串函数也无从正常处理Unicode。为了把unicode投入实用,出现了UTF,最广泛的是UTF-8和UTF-16。 

里UTF-16和Unicode本身的编码是均等的,UTF-32和UCS-4也是相同的。最着重之是UTF-8,可以了兼容ascii编码
。UTF是同样栽变长的编码,它的字节数是未固定的,使用第一独字节确定字节数。第一个字节首为0即一个字节,110即使2字节,1110即使3字节,字符后续字节都用10开,这样非见面混淆且单字节英文字符可遵循用ASCII编码。理论及UTF-8最要命可以用6字节代表一个字符,但Unicode目前从不就此大于0xffff的字符,实际UTF-8最多下了3独字节。 

unicode转化为UTF-8的方法 

Unicode码范围 UTF-8编码(把Unicode码转为二进制填充x处)
0000-007F 0xxxxxxx
0080-07FF 110xxxxx 10xxxxxx
0800-FFFF 1110xxxx 10xxxxxx 10xxxxxx 

字之Unicode编码范围是0080-07FF,因此是2字节编码。 

Big Endian(大字节序)和Little Endian(小字节序): 

Unicode存储时发生个字节序问题,就是一个多字节数字,是自十分及有些排列还是恰恰相反。这与CPU处理有关,一般x86处理常都是倒置的,即大数在前方。就像“莫”字之Unicode码0x83ab,按Big
Endian就成为了0xab83。 

BOM(Byte Order Mark): 

因为Unicode存储时许节序的题目,在Unicode文本前安插一个非存在的字符(ZERO
WIDTH NO-BREAK SPACE)作为标志来分辨两种植字节序。标志0xfeff说明按Big
Endian字节序,而0xfffe说明Little-Endian。 

UTF-8不欲BOM来说明字节序,但足以就此BOM标志编码方式。遇到带0xefbbbf开头的文件,计算机就得不需分辨直接以UTF-8编码处理。 

BMP(Basic Multilingual Plane): 

即是Unicode实际和字符对应的分开方式吃的概念。 

按UCS-4为例子 

首字节首员恒为0,剩下7员可分开2^7=128个group(组)。 

其次单字节,每个group下面可以生出2^8=256独plane(平面)。 

其三个字节,可以叫每个palne带来256单row(行)。 

季独字节,这里的8位又有何不可每row可以分256个cell(格子)。 

group 0中之plane
0就是BMP,即前少单字节为0×0000底UCS-4码。去掉0×0000的BMP上的UCS-4就改成了UCS-2编码。或者说UCS-2是USC-4的子集,BMP就是UCS-2在USC-4中的职位。我们由这边尚足以得USC-2转为UCS-4的方,再UCS-2前面插入2个字节0×0000。 

来源:http://blog.csdn.net/zzcv_/archive/2007/06/03/1636085.aspx 

相关文章