【转】字符编码笔记:ASCII,Unicode和UTF-8

原址:http://www.ruanyifeng.com/blog/2007/10/ascii\_unicode\_and\_utf-8.html

 

作者: 阮一峰

日期: 2007年10月28日

今天中午,我突然想搞清楚Unicode和UTF-8之间的涉,于是便起当网上查看资料。

结果,这个题材比自己设想的繁杂,从午饭后直看晚上9点,才好不容易起来做懂。

下就是是自身的笔记,主要为此来打点好的笔触。但是,我尽可能待写得通俗易懂,希望能针对另朋友出因此。毕竟,字符编码是电脑技术之根本,想如果熟练使用电脑,就亟须掌握一点字符编码的学识。

  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,就比如它的名都意味着的,这是同样栽有符号的编码。

Unicode当然是一个大十分的汇聚,现在的范畴足以包容100多万只记。每个符号的编码还未一致,比如,U+0639意味着阿拉伯字母Ain,U+0041意味英语的不得了写字母A,U+4E25代表汉字”严”。具体的记对应表,可以查询unicode.org,或者特别的字对应表。

  1. 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编码非常简单。如果一个字节的首先员是0,则这字节单独就是一个字符;如果第一位是1,则连发生略只1,就象征即字符占用小个字节。

脚,还是因为汉字”严”为例,演示如何兑现UTF-8编码。

都知晓”严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处于第三执行之限量外(0000
0800-0000 FFFF),因此”严”的UTF-8编码需要三只字节,即格式是”1110xxxx
10xxxxxx
10xxxxxx”。然后,从”严”的终极一个二进制位开始,依次从晚迈入填入格式中的x,多出底各项补0。这样即便得了,”严”的UTF-8编码是”11100100
10111000 10100101″,转换成十六进制就是E4B8A5。

  1. Unicode及UTF-8之间的易

通过上亦然省的事例,可以看到”严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是无一样的。它们中的换可以由此程序实现。

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

皇冠直营现金网官方网 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编码,也就是是高达平等节谈到的编码方法。

分选了”编码方式”后,点击”保存”按钮,文件之编码方式就即刻转换好了。

  1. 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,就象征该公文采用小头方式。

  1. 实例

下面,举一个实例。

开辟”记事本”程序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″就是”严”的实际编码,它的蕴藏顺序与编码顺序是相同的。

  1. 延伸阅读

* 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的确定)

(完)

 

相关文章