字符集及编码[上]

深漫长很久以前,有同等博人,他们操纵用8独可开合的结晶管来做成不同之状态,以象征世界上的万物。他们以为8只开关状态作为原子单位那个好,于是他们拿当时叫”字节约”。 

双重后来,他们又做了部分方可处理这些字节的机器,机器开动了,可以据此字节来构成有更多的状态,状态开始变来变去。他们见到这般是好的,于是它就是顿时机器称为”计算机”。 

字符集及编码

初始计算机只在美国因而。八员的字节一共可以组成产生256(2的8次方)种不同的状态。 

 

她俩拿中的编号从0开始的32种状态分别规定了特殊之用处,一只是顶设备或者打印机遇上这些约定好之字节时,就假设举行有约定的动作。遇上
00×10, 终端就换行,遇上0x07, 终端就朝着人们嘟嘟叫,例好遇上0x1b,
打印机就打印反白的许,对于极端就用彩色显示字母。他们看到如此十分好,于是就管这些0x20(十进制32)以下的字节状态叫做”控制码”。 

不行老很久以前,有同一群人,他们决定用8单可开合的结晶管来做成不同的状态,以象征世界上之万物。他们视8个开关状态是好的,于是他们将立即叫”字节“。

她们同时管所有的空格、标点符号、数字、大小写字母分别就此连的字节状态表示,一直编到了第127哀号,这样计算机就好为此不同字节来囤积英语的
文字了。大家看看这般,都感到非常好,于是大家都将这方案叫做 ANSI
的”Ascii”编码(American Standard Code for Information
Interchange,美国信相互换标准代码)。当时世界上保有的计算机都用同的ASCII方案来保存英文字。 

 

新生,就如打巴比伦塔同,世界各地的都开始使用微机,但是多国家为此的非是英文,他们之所以到的过多字母在ASCII中常有没有,为了为可以当微机被保存他们之文字,他们说了算用127号之后的空位来代表这些新的假名、符号,还投入了众写表格时要为此生及之横线、竖线、交叉等形象,一直将序号编到了最终一个状态255。从128届255应声等同页的字符集被如”扩展字符集”。从此之后,贪婪之人类还无初的状态可以为此了,美帝国主义可能没想到还有第三世界国家之众人也期待可以用到电脑吧! 

再后来,他们又举行了有的可处理这些字节的机械,机器开动了,可以就此字节来做产生成千上万状态,状态开始变来变去。他们看来这么是好之,于是它就是即刻机器称为”计算机”。

相当中国人们得到计算机时,已经没有可行使的字节状态来代表汉字,况且有6000大多独常因此汉字需要保留也。但是这难不倒智慧之华夏公民,我们不客气地管那些127声泪俱下过后的奇异符号们直收回掉,并且确定:一个低于127的字符的意义与原先一样,但个别只过127底字符连在一起时,就意味着一个汉字,前面的一个字节(他叫高字节)从0xA1所以到
0xF7,后面一个字节(低字节)从0xA1及0xFE,这样我们就是得结合产生大约7000多个简体汉字了。在这些编码里,我们还将数学符号、罗马希腊的字母、日文的字母们还编上了,连以
ASCII
里当就是有数字、标点、字母都统统重新编了少数只字节长的编码,这即是不时说之”全角”字符,而原在127号以下的那些不畏深受”半较量”字符了。 

 

华夏老百姓看看这般非常是,于是就把这种汉字方案叫做”GB2312″。GB2312 是针对性
ASCII 的国语扩展。 

起,计算机只在美国于是。八个之字节一共可以组合出256(2底8次方)种不同之状态。

可是中国的汉字太多矣,我们很快就不怕发现有很多人之全名没有法于此间从出来,特别是一些老会烦人家的国度领导人(如朱镕基的“镕”字)。于是我们只能连续将
GB2312 没有行使的码位找出来老实不谦虚地用上。 

 

新兴要不够用,于是干脆不再要求小字节一定是127哀号之后的内码,只要第一独字节是出乎127虽稳表示这是一个汉字的上马,不管后面与的是勿是扩张字符集里的情。结果扩展之后的编码方案被叫作
GBK 标准,GBK 包括了 GB2312
的有情节,同时还要追加了将近20000独新的汉字(包括繁体字)和记。 

她俩拿其中的号子从0开始的32种植状态分别规定了奇特的用,一旦终端、打印机遇上预定好之这些字节被传染过来时,就如召开一些预约的动作。遇上
00×10, 终端就换行,遇上0x07, 终端就朝人们嘟嘟叫,例如遇上0x1b,
打印机就打印反白的许,或者极端就用彩色显示字母。他们见到如此十分好,于是便拿这些0x20之下的字节状态叫做”控制码“。

后来少数民族也如就此计算机了,于是我们再扩大,又加以了几千单新的少数民族的字,GBK
扩成了 GB18030。从此以后,中华民族的知识就可以以处理器时代中传承了。 

 

华夏底程序员们见状就同一名目繁多汉字编码的规范是好之,于是通称他们叫做
“DBCS”(Double Byte Charecter Set
双配节字符集)。在DBCS系列专业里,最可怜的特色是有限配节长的方块字字符和同配节长的英文字符并存于跟同效编码方案里,因此他们写的次序为支持中文处理,必须使顾字串里之各个一个字节的价值,如果这个价是超出127之,那么就算觉得一个双字节字符集里的字符出现了。那时候是被过加持,会编程的微机僧侣们都要每天念下面这个咒语数百满: 

她们而管持有的空格、标点符号、数字、大小写字母分别就此连的字节状态表示,一直编到了第127哀号,这样计算机就可以据此不同字节来囤积英语的文了。大家看到这般,都发甚好,于是大家还把此方案叫做
ANSI 的”ASCII“编码(American Standard Code for
Information
Interchange,美国音交互换标准代码)。当时世界上享有的微处理器都因此同一的ASCII方案来保存英文字。

“一个字毕竟少单英文字符!一个汉字毕竟少只英文字符……” 

 

为这相继国家都像中华这样为来同样学好的编码标准,结果相互之间孰也未懂得谁的编码,谁吗不支持别人的编码,连大陆和台湾如此光相隔了150海里,使用正在同样种植语言的小兄弟地区,也分头采取了不同之
DBCS
编码方案——当时底中华人数怀念被电脑显示汉字,就必作及一个”汉字系统”,专门就此来拍卖汉字的展示、输入的题材,但是大台湾之无知封建人士形容的算命程序就算必须加装另一样模仿支持
BIG5
编码的啊”倚天汉字系统”才好据此,装错了字符系统,显示就见面乱了拟!这怎么处置?而且世界民族之林中还有那些一时因此无达电脑的贫寒百姓,他们之文字以怎处置? 

后来,就像盖巴比伦塔同一,世界各地的还开始用电脑,但是众多国之所以之未是英文,他们之假名里出成百上千凡是ASCII里没有的,为了好以处理器保存他们之文,他们决定使用127号之后的空位来代表这些新的字母、符号,还投入了广大写表格时用动用的横线、竖线、交叉等造型,一直拿序号编到了最后一个态255。从128到255及时无异页的字符集被如”扩展字符集”。从此后,贪婪的人类还没新的状态好就此了,美帝国主义可能无想到还有第三世界国家之人们呢意在得以为此到计算机吧!

正是计算机的巴比伦塔命题啊! 

 

碰巧以此时,大天使加百列及时出现了——一个吃 ISO
(国际标谁化组织)的国际社控制下手解决这个题材。他们下的不二法门好简短:废了具有的地区性编码方案,重新做一个概括了地球上有知识、所有字母和标志的编码!他们打算给它们”Universal
Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。 

等于中华人们得到计算机时,已经没得使的字节状态来表示汉字,况且有6000几近个常因此汉字需要保留也。但是及时难休倒智慧之中原国民,我们不客气地管那些127如泣如诉随后的奇异符号们直接注销掉,
规定:一个低于127底字符的义与原来平,但少独盖127的字符连在一起时,就意味着一个中国字,前面的一个字节(他号称高字节)从0xA1所以到
0xF7,后面一个字节(低字节)从0xA1至0xFE,这样我们就是可以做出约7000几近个简体汉字了。在这些编码里,我们尚将数学符号、罗马希腊之字母、日文的字母们还编上了,连以
ASCII
里当就是有些数字、标点、字母都备重新编了片只字节长的编码,这就算是不时说之”全角“字符,而原本在127哀号以下的那些不畏叫”半角“字符了。

UNICODE
开始制定时,计算机的存储器容量极大地开拓进取了,空间还为非化问题了。于是
ISO
就一直确定得用鲜个字节,也尽管是16员来归并意味着有的字符,对于ascii里之那些”半交锋”字符,UNICODE
包持其原编码不转移,只是将该尺寸由原本的8各项扩展为16各项,而其余文化与言语的字符则通复合并编码。由于”半竞”英文符号只待用到低8位,所以其高
8号永远是0,因此这种大气的方案在保存英文文本时见面多浪费一加倍之长空。 

 

这会儿,从原始社会里倒过来的程序员开始察觉一个飞之观:他们的strlen函数靠不停止了,一个字不再是一对一给片独字符了,而是一个!是
的,从 UNICODE
开始,无论是半角的英文字母,还是全角的字,它们还是联合之”一个字符”!同时,也还是联的”两个字节”,请留心”字符”和”字节约”两单术语的不等,
“字节约”是一个8号的大体存贮单元,而”字符”则是一个知识有关的记号。在UNICODE
中,一个字符就是少数只字节。一个汉字毕竟少独英文字符的时期曾抢过去了。 

华全员看到如此好科学,于是便拿这种汉字方案叫做 “GB2312“。GB2312 是对准 ASCII 的华语扩展。

往年多字符集存在时时,那些做多语言软件之铺面受上了特别可怜累,他们为当不同之国度销售一律仿软件,就只能于区域化软件时为加持那个双字节字符集咒语,不仅使处处小心不要做错,还要将软件被之亲笔以不同之字符集中转来改变去。UNICODE
对于他们吧是一个十分好的一揽子解决方案,于是从 Windows NT 开始,MS
趁机把她的操作系统改了千篇一律举,把装有的主干代码都更改成为了所以 UNICODE
方式工作之本子,从此时起,WINDOWS
系统终于任需要加装各种本土语言系统,就可展示全世界上有着知识的字符了。 

 

然而,UNICODE 在制订时未尝设想与外一样种植现有的编码方案保持兼容,这使
GBK 与UNICODE
在汉字之内码编排及了是不等同的,没有同种植简单的算术方法好将公文内容从UNICODE编码和另外一样栽编码进行转移,这种转移必须透过查表来开展。 

然而中国之方块字太多矣,我们快便发现有好多人之全名没有法于此间打出来,特别是一些老会烦人家的国度领导人。于是我们只好继续把
GB2312 没有动用的码位找出来老实不客气地用上。

如前所述,UNICODE
是为此鲜个字节来代表也一个字符,他合计可构成出65535不同之字符,这大概已经足以覆盖世界上保有知识之标记。如果还不够啊从来不涉及,ISO已经准备了UCS-4方案,说简练了就是是四只字节来表示一个字符,这样我们便可以组成产生21亿个不同之字符出来(最高位产生另用途),这大概可以据此到银河联邦成立那同样上吧! 

 

UNICODE 到时,一起赶到之还有计算机网络的兴起,UNICODE
如何当网络上传也是一个亟须考虑的问题,于是面向传输的重重 UTF(UCS
Transfer
Format)标准出现了,顾名思义,UTF8就是历次8只各类传输数据,而UTF16不怕是每次16独各,只不过为了传输时之可靠性,从UNICODE到
UTF时连无是直的照应,而是一旦了有算法和规则来转换。 

新兴还是不够用,于是干脆不再要求小字节一定是127声泪俱下过后的内码,只要第一个字节是盖127尽管固定表示这是一个字之起,不管后面和的凡免是扩张字符集里之始末。结果扩展之后的编码方案被喻为
GBK 标准,GBK 包括了 GB2312
的有所内容
,同时还要添了靠近20000单新的汉字(包括繁体字)和标记。

未遭了网编程加持的电脑僧侣们都知情,在网络里传递信息时起一个十分重点的问题,就是对此数据高低位的解读道,一些计算机是使用低先发送的法子,例如我们PC机采用的
INTEL
架构;而另外一部分凡是采用高位先发送的主意。在网被交换数据时,为了审批双方于高低位的认识是否是同样的,采用了平等种很轻便的法,就是在文本流的起时向对方发送一个标志符——如果后的文本是高位在位,那就算发送”FEFF”,反之,则发送”FFFE”。不信仰而得据此二进制方式打开一个UTF-X格式的文本,看看开头两独字节是勿是立半个字节? 

 

下面是Unicode和UTF-8转换的条条框框 

新兴少数民族也只要就此电脑了,于是我们再扩大,又加了几千只新的少数民族的配,GBK
扩成了 GB18030。从此后,中华民族的文化就是可在电脑时代中承受了。

Java代码  

 

  1. Unicode  
  2.   
  3. UTF-8  
  4.   
  5. 0000 – 007F  
  6.   
  7. 0xxxxxxx  
  8.   
  9. 0080 – 07FF  
  10.   
  11. 110xxxxx 10xxxxxx  
  12.   
  13. 0800 – FFFF  
  14.   
  15. 1110xxxx 10xxxxxx 10xxxxxx  

中华的程序员们看到这等同多样汉字编码的业内是好的,于是通称他们叫做
DBCS“(Double Byte Charecter Set
双配节字符集)。在DBCS系列标准里,最可怜之特色是少许节长的汉字字符和平等配节长的英文字符并存于与同效编码方案里,因此他们写的次序为支持中文处理,必须要专注字串里之各级一个字节的值,如果此价值是过127的,那么即便以为是一个双字节字符集里的字符出现了。那时候是会编程的计算机僧侣们还设每天念下面这咒语数百不折不扣:

 

 

比如说”汉”字之Unicode编码是6C49。6C49当0800-FFFF之间,所以一旦因此3字节模板:1110xxxx
10xxxxxx 10xxxxxx。将6C49勾成二进制是:0110 1100 0100
1001,将这个比较特流按三字节模板的分支方法分为0110 110001
001001,依次代替模板被之x,得到:1110-0110 10-110001 10-001001,即E6 B1
89,这便是其UTF8的编码。 

“一个汉字毕竟少只英文字符!一个中国字毕竟少只英文字符……”

说道到这里,我们再次顺便说说一个颇红的意外现象:当你在 windows
的记事本里新建一个文件,输入”联通”两只字后,保存,关闭,然后再次打开,你会意识这片单字已经烟消云散了,代之的是几只乱码!呵呵,有人说就即是联通之所以拼不过移动的因。 

 

其实就是以GB2312编码和UTF8编码产生了编码冲撞的原故。 

盖就逐条国家还如中华这样弄来同样法自己之编码标准,结果相互之间孰吧无知底谁之编码,谁啊未支持别人的编码,连大陆和台湾如此只是隔了150海里,使用正在同等种植语言的兄弟地区,也独家采用了不同的
DBCS
编码方案。当时底神州人感念为电脑显示汉字,就亟须装上一个”汉字系统”,专门就此来处理汉字之亮、输入的题材,但是老台湾之愚昧封建人士形容的算命程序即使必加装另一样拟支持
BIG5
编码的呦”倚天汉字系统”才足以为此,装错了字符系统,显示就会见乱了法!这怎么收拾?而且世界民族之林中还有那些一时就此非达电脑的贫寒百姓,他们之亲笔以怎么收拾?

当一个软件打开一个文件时,它而做的率先桩事是决定这个文件究竟是使啊种字符集的啊种编码保留的。软件一般采用三种方式来控制文本的字符集及编码: 

 

检测文件头标识,提示用户挑选,根据早晚之条条框框猜测 

算计算机的巴比伦塔命题啊!

顶专业的门径是检测文本最开始的几个字节,开头字节
Charset/encoding,如下表: 

 

  

正巧以这儿,大天使加百列及时出现了:一个叫 ISO
(国际标谁化组织)的国际社控制下手解决之题目。他们下的措施好粗略:废了拥有的地区性编码方案,重新做一个包括了地上所有知识、所有字母和标志的编码!他们打算给它们”Universal
Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE“。

Java代码  

 

  1. EF BB BF UTF-8  
  2.   
  3. FF FE UTF-16/UCS-2, little endian  
  4.   
  5. FE FF UTF-16/UCS-2, big endian  
  6.   
  7. FF FE 00 00 UTF-32/UCS-4, little endian.  
  8.   
  9. 00 00 FE FF UTF-32/UCS-4, big-endian.  

UNICODE
开始制定时,计算机的存储器容量极大地发展了,空间还为未化问题了。于是
ISO
就直接规定必须用鲜只字节,也就是是16员来归并意味着所有的字符,对于ASCII里之那些”半赛”字符,UNICODE
包持其原编码不移,只是将那尺寸由本的8各项扩展为16各项,而其余文化以及言语的字符则整个重合并编码。由于”半竞技”英文符号只待因此到低8员,所以其高
8位永远是0,因此这种大气的方案以保留英文文本时见面多浪费一倍增之上空。

当你新建一个文书文件时,记事本的编码默认是ANSI(代表网默认编码,在中文系统中貌似是GB系列编码),
如果你以ANSI的编码输入汉字,那么他骨子里就是是GB系列的编码方式,在这种编码下,”联通”的内码是: 

 

   

此时,从旧社会里走过来的程序员开始意识一个想不到的景:他们的strlen函数靠不鸣金收兵了,一个中国字不再是一定给少数单字符了,而是一个!是的,
UNICODE
开始,无论是半角的英文字母,还是全角的字,它们还是联合之”一个字符”!同时,也还是联的”两个字节”。
请求留意”字符”和”字节约”两只术语的不等,”字节“是一个8号之情理存贮单元,而”字符“则是一个知识相关的记。在UNICODE
中,一个字符就是简单个字节。一个字毕竟少单英文字符的时都快过去了。

Java代码  

 

  1. c1 1100 0001  
  2.   
  3. aa 1010 1010  
  4.   
  5. cd 1100 1101  
  6.   
  7. a8 1010 1000  

往常开外字符集存在时时,那些做多语言软件之号中上过怪要命累,他们为当不同之国销售一律模仿软件,就不得不以区域化软件时也加持那个双字节字符集咒语,不仅要处处小心不要将错,还要管软件面临之亲笔在不同的字符集中转来改去。UNICODE
对于他们吧是一个老大好的圆解决方案,于是从 Windows NT 开始,MS
趁机将它的操作系统改了一致全副,把持有的中心代码都改变化了为此 UNICODE
方式行事之版本,从此时开始,WINDOWS
系统终于任需加装各种本土语言系统,就可来得全世界上具备知识之字符了。

顾到了邪?第一次之独字节、第三季个字节的序曲部分的都是”110″和”10″,正好跟UTF8规则里的两字节模板是平等的, 

 

于是当我们又打开记事本时,记事本就误认为这是一个UTF8编码的公文,让我们拿第一个字节的110暨次单字节的10夺丢,我们就收获了”00001
101010″,再把诸位对旅,补及带领的0,就获了”0000 0000 0110
1010″,不好意思,这是UNICODE的006A,也不怕是聊写的字母”j”,而下的片字节用UTF8解码之后是0368,这个字符什么吗非是。这就是是只有”联通”两独字的文本没有法于记事本里正常显示的故。 

唯独,UNICODE 在制定时没有设想与任何一样栽现有的编码方案保持兼容,这叫
GBK 与UNICODE
在汉字的内码编排及了是无均等的,没有同种植简单的算术方法好将公文内容由UNICODE编码和另一样栽编码进行换,这种转移必须透过查表来进行。

若果设您以”联通”之后多输入几单字,其他的许之编码不见得又正好是110以及10始的字节,这样还打开时,记事本就不见面坚持立是一个utf8编码的文书,而会用ANSI的措施解读的,这时乱码又无出现了。

 

如前所述,UNICODE
是用少独字节来代表也一个字符,他一共可构成出65535例外的字符,这大概已经得以挂世界上拥有知识的记。如果还不够啊不曾提到,ISO已经准备了UCS-4方案,说简单了即是四个字节来代表一个字符,这样我们不怕可以做有21亿只例外之字符出来(最高位有其他用途),这大概可以就此到银河联邦成立那同样天吧!

 

UNICODE 来到时,一起赶到之还有电脑网络的兴起,UNICODE
如何在网达到传也是一个不能不考虑的问题,于是面向传输的累累 UTF(UCS Transfer
Format)标准出现了,顾名思义,UTF8纵然每次8只各类传输数据,而UTF16便每次16个号,只不过为了传输时的可靠性,从UNICODE到
UTF时并无是一直的对应,而是一旦由此一些算法和规则来更换。

 

备受过网编程加持的微机僧侣们都亮,在网里传递信息时发生一个杀关键之题目,就是于数据高低位的解读道,一些处理器是采取低先发送的艺术,例如我们PC机采用的
INTEL
架构,而其余一些是利用高位先发送的方法,在网络中交换数据常常,为了对双方对高低位的认是否是一律的,采用了同等种植非常省心的主意,就是以文本流的启经常于对方发送一个标志符。如果之后的文书是高位在先,那就是发送”FEFF”,反之,则发送”FFFE”。不信仰你可以用二进制方式打开一个UTF-X格式的文书,看看开头两独字节是不是即刻有限个字节?

 

叙到这边,我们重新顺便说说一个生有名的意料之外景象:当您于 windows
的记事本里新建一个文书,输入”联通”两独字下,保存,关闭,然后重新打开,你见面发觉立即有限只字就一去不返了,代的的凡几个乱码!呵呵,有人说立刻便是联通之所以拼不过移动的因。

 

实在这是坐GB2312编码和UTF8编码产生了编码冲撞的原委。

 

自网上引来一段子于UNICODE到UTF8的转换规则:

Unicode

UTF-8

0000 – 007F

0xxxxxxx

0080 – 07FF

110xxxxx 10xxxxxx

0800 – FFFF

1110xxxx 10xxxxxx 10xxxxxx

 

诸如:”汉”字的Unicode编码是6C49。
6C49当0800-FFFF之间,所以只要用3字节模板:1110xxxx 10xxxxxx
10xxxxxx。将6C49描写成二进制是:0110 1100 0100
1001,将这于特流按照三字节模板的分方法分为0110 110001
001001,依次代替模板被的x,得到:1110-0110 10-110001 10-001001,即E6 B1
89,这虽是那个UTF8的编码。

 

若果当你新建一个文件文件时,记事本的编码默认是ANSI,
如果你在ANSI的编码输入汉字,那么她事实上就是是GB文山会海(简体中文系列)的编码方式,在这种编码下,”联通”的内码是:

 

“联”字的内码是:c1aa

c1 (1100 0001)

aa (1010 1010)

 

“通”字之内码是:cda8

cd (1100 1101)

a8 (1010 1000)

 

顾到了邪?第一亚单字节、第三季单字节的苗子部分的还是”110″和”10″,正好与UTF8规则里之两字节模板是同的,于是又打开记事本时,记事本就误认为这是一个UTF8编码的文书,让咱们管第一独字节的110及第二个字节的10夺丢,我们即便获取了”00001
101010″,再管各位对共同,补上引导的0,就取了”0000 0000 0110
1010″,不好意思,这是UNICODE的006A,也即是有些写的字母”j”,而从此的片字节用UTF8解码之后是0368,这个字符什么吗不是。这就算是只有”联通”两只字的文本没有章程在记事本里正常显示的缘故。

 

比方要你以”联通”之后多输入几个字,其他的字的编码不见得又恰好是110与10从头的字节,这样又打开时,记事本就未会见坚持立是一个utf8编码的文件,而会用ANSI的主意解读的,这时乱码又不出新了。

 

来源:http://www.javaeye.com/topic/398782

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图