到底领略掌握编码知识,常识详解

每二个程序员都不可制止的蒙受字符编码的题材,尤其是做Web开发的程序员,“乱码难题”向来是令人头疼的标题,只怕你曾经很少蒙受“乱码”难点,可是,对化解乱码的艺术的内在规律,您是不是领悟?自身作为三个程序员,在字符编码方面同样碰到许多难题,而且一贯对各样编码懵懵懂懂、不清不楚;在工作中也早就遭遇一个很可恶的编码难点。这两日在网上征集了汪洋编码方面包车型地铁资料,对字符编码算是精通的比较清楚了。上面把自家以为相比首要的知识点记录下来,一方面方便未来复习;另一方面也意在给跟小编同样懵懵懂懂的人三个参阅。不对或不妥之处,请批评指正。

 

 

 每1个程序员都不可幸免的相遇字符编码的标题,尤其是做Web开发的程序员,“乱码问题”一直是令人发烧的难点,或许你已经很少遭遇“乱码”难题,然则,对消除乱码的方法的内在规律,您是否知道?本人作为三个程序员,在字符编码方面同等碰着重重题材,而且直接对各个编码懵懵懂懂、不清不楚;在工作中也早已蒙受2个很讨厌的编码难题。那二日在网上收集了大批量编码方面包车型地铁资料,对字符编码算是精晓的比较清楚了。上边把自家觉得相比重要的知识点记录下来,一方面有利于以往复习;另一方面也可望给跟自个儿同一懵懵懂懂的人八个参照。不对或不妥之处,请批评指正。

在此之前,先了然一些有效概念:“字符集”、“字符编码”和“内码”。

 

壹 、字符集与字符编码

字符是各样文字和标记的总称,包蕴各种国家文字、标点符号、图形符号、数字等。字符集是八个字符的汇集,字符集连串较多,各样字符集包蕴的字符个数不一样,常见字符集有:ASCII字符集、ISO
8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。总计机要可相信的处理种种字符集文字,须要展开字符编码,以便总计机能够分辨和存款和储蓄各个文字。 

 

编码(encoding)和字符集差异。字符集只是字符的聚集,不自然适合营互联网传递、处理,有时须经编码(encode)后才能运用。如Unicode可依不相同要求以UTF-⑧ 、UTF-1六 、UTF-32等方法编码。

 

字符编码便是以二进制的数字来对应字符集的字符。

 

故而,对字符进行编码,是音信调换的技术基础。

 

采Nash么字符。也便是说哪些汉字,字母和符号会被收入标准中。所包括“字符”的集合就叫做“字符集”。

分明各个“字符”分别用3个字节照旧五个字节存款和储蓄,用什么样字节来囤积,那个规定就叫做“编码”。

 

逐条国家和所在在制定编码标准的时候,“字符的成团”和“编码”一般都以还要制定的。因而,日常大家所说的“字符集”,比如:GB2312,
GBK, JIS 等,除了有“字符的聚合”那层含义外,同时也包蕴了“编码”的意思。

 

只顾:Unicode字符集有多样编码方式,如UTF-捌 、UTF-16等;ASCII只有一种;半数以上MBCS(包罗GB2312)也唯有一种。

此前,先领会一些使得概念:“字符集”、“字符编码”和“内码”。

二 、什么是内码?

2.1 维基百科的表达

 

在电脑科学及相关领域个中,内码指的是“将新闻编码后,透过某种格局储存在特定记念装置时,装置内部的编码情势”。在分化的系统中,会有两样的内码。

在既往的英文系统中,内码为ASCII。在繁体中国语言医学系统中,最近常用的内码为大五码(Big5)。在简体中国语言法学系统中,内码则为国家标准码(国标代码:今后强制供给使用GB18030标准;较旧总计机依旧采取GB2312)。而统一码(Unicode)则为另一常见内码。

 

2.2 百度健全的演说

 

内码是指整体系统中接纳的二进制字符编码,是维系输入、输出与系统平台之间的调换码,通过内码能够直达通用和高效能传输文本的指标。比如MS
Word中所存款和储蓄和调用的便是内码而非图形文字。英文ASCII字符采取一个字节的内码表示,粤语字符如国家标准字符集中,GB231贰 、GB1234⑤ 、GB1两千皆用双字节内码,GB18030(27,533汉字)双字节内码汉字为20,901个,其余6,6叁十四个汉字用四字节内码。

一 、字符集与字符编码

字符是种种文字和标记的总称,包蕴各样国家文字、标点符号、图形符号、数字等。字符集是七个字符的聚合,字符集种类较多,每一种字符集包蕴的字符个数差别,常见字符集有:ASCII字符集、ISO
8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。总结机要准确的处理种种字符集文字,须要开始展览字符编码,以便总结机能够分辨和存款和储蓄各样文字。 

 

编码(encoding)和字符集分化。字符集只是字符的会面,不自然适合营网络传递、处理,有时须经编码(encode)后才能动用。如Unicode可依不一致必要以UTF-八 、UTF-1六 、UTF-32等艺术编码。

 

字符编码正是以二进制的数字来对应字符集的字符。

 

就此,对字符进行编码,是音讯沟通的技艺基础。

 

接Nash么字符。也便是说哪些汉字,字母和标志会被收入标准中。所包涵“字符”的集结就叫做“字符集”。

明确每一种“字符”分别用一个字节依旧七个字节存款和储蓄,用什么样字节来储存,这几个规定就叫做“编码”。

 

逐条国家和地段在制定编码标准的时候,“字符的成团”和“编码”一般都以还要制定的。由此,日常大家所说的“字符集”,比如:GB2312,
GBK, JIS 等,除了有“字符的会晤”那层含义外,同时也包蕴了“编码”的含义。

 

瞩目:Unicode字符集有多种编码方式,如UTF-八 、UTF-16等;ASCII唯有一种;超过八分之四MBCS(包涵GB2312)也只有一种。

③ 、字符编码分类总计

上边从电脑对多国语言支持的角度来总结字符编码。

 

3.1 ASCII编码

 

以下来自“维基百科”:

ASCII(American Standard Code for Information
Interchange,U.S.A.新闻交流标准代码)是基于拉丁字母的一套电脑编码系统。它至关心注重要用于显示现代保加澳门语,而其扩张版本EASCII则能够勉强展现别的西欧语言。它是现行反革命最通用的单字节编码系统(可是有被UniCode追上的征象),并一致国际标准ISO/IEC
646。

ASCII第③遍以专业标准的型态发布是在1969年,末了三遍革新则是在1987年,现今停止共定义了1二十八个字符;个中叁十个字符不恐怕出示(那是以现行反革命操作系统为依归,但在DOS格局下可体现出一部分诸如笑脸、扑克牌花式等8-bit符号),且那叁十个字符多数都已是陈废的控制字符。控制字符的用处首若是用来操控已经处理过的文字。在3七个字符之外的是9多少个可兆示的字符,包罗用键盘敲下空白键所爆发的空白字符也算3个可突显字符(突显为空白)。

ASCII表:见http://zh.wikipedia.org/zh-cn/ASCII

 

ASCII缺点:

ASCII的最大弱点是只好显示2五个着力拉丁字母、阿拉伯数字和英式标点符号,由此不得不用来展现现代美利哥俄语(而且在拍卖克罗地亚共和国(Republika Hrvatska)语当中的外来词如naïve、café、élite等等时,所有重音符号都只可以去掉,就算那样做会违反拼写规则)。而EASCII尽管缓解了部份西欧语言的显得难题,但对更加多别的语言照旧不知所厝。由此今后的苹果电脑已经舍弃ASCII而转用Unicode。

 

最早的英文DOS操作系统的种类内码是:ASCII。总结机那时候只支持乌克兰(Ukraine)语,别的语言不可见在处理器存款和储蓄和呈现。

 

在该阶段,单字节字符串使用2个字节存放二个字符(SBCS,Single Byte
Character System)。如:”鲍伯123″占多少个字节。

 

3.2 ANSI编码

 

为使总结机援救更加多语言,平日选用0x800~xFF范围的3个字节来代表三个字符。比如:汉字
‘中’ 在国语操作系统中,使用 [0xD6,0xD0]那四个字节存款和储蓄。

 

今非昔比的国家和地面制定了分歧的行业内部,由此产生了GB2312,BIG5,JIS等分头的编码标准。这么些应用二个字节来代表一个字符的种种汉字延伸编码情势,称为
ANSI 编码。在简体中国语言医学系统下,ANSI 编码代表 GB2312
编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

 

差别 ANSI
编码之间互不兼容,当音信在列国间调换时,无法将属于二种语言的文字,存款和储蓄在同一段
ANSI 编码的文本中。

 

普通话DOS、中文/日文Windows 95/98一代系统内码使用的是ANSI编码(本地化)

 

在运用ANSI编码支持多语言阶段,每一个字符使用八个字节或多个字节来代表(MBCS,Multi-Byte
Character
System),因而,那种措施存放的字符也被称作多字节字符。比如,”粤语123″
在粤语 Windows 95
内部存款和储蓄器中为柒个字节,每一个汉字占三个字节,各个英文和数字字符占3个字节。

 

在非 Unicode
环境下,由于差异国家和地段利用的字符集区别等,很或者出现不能平常显示全部字符的气象。微软公司采纳了代码页(Codepage)转换表的技艺来过渡性的部分化解这一问题,即经过点名的变换表将非
Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode
编码。可以在“语言与区域设置”中选拔2个代码页作为非 Unicode
编码所采用的暗中认可编码方式,如936为简体汉语GBK,950为小篆粤语Big5(皆指PC上运用的)。在这种景观下,一些非阿尔巴尼亚语的亚洲语言编写的软件和文书档案很恐怕出现乱码。而将代码页设置为对应语言汉语处理又会现出问题,这一气象不能幸免。从根本上说,完全使用统一编码才是化解之道,但日前尚不也许形成那或多或少。

  代码页技术以后大规模为种种平台所利用。UTF-7 的代码页是6伍仟,UTF-8
的代码页是65001。

 

3.3 Unicode编码

 

为了使国际间消息沟通进一步有利于,国际社团制订了 UNICODE
字符集,为种种语言中的每八个字符设定了联合并且唯一的数字编号,以满意跨语言、跨平台拓展文本转换、处理的必要。

 

Unicode字符集能够简写为UCS(Unicode Character
Set)。早期的unicodeUnicode标准有UCS-② 、UCS-4的说教。UCS-2用八个字节编码,UCS-4用多少个字节编码。

 

在 UNICODE 被选择之后,计算机存放字符串时,改为寄放每一种字符在 UNICODE
字符集中的序号。如今电脑一般选拔 2 个字节(十几位)来存放3个序号(DBCS,Double Byte Character
System),因而,那种格局存放的字符也被称作宽字节字符。比如,字符串
“普通话123” 在 Windows 三千 下,内部存款和储蓄器中实际上存放的是 多少个序号,一共11个字节。

 

Unicode字符集包括了各个语言中采取到的持有“字符”。用来给 UNICODE
字符集编码的正式有好三种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle,
UnicodeBig 等。

二 、什么是内码?

2.1 维基百科的分解

 

在微型总括机科学及相关领域个中,内码指的是“将消息编码后,透过某种方式储存在特定回想装置时,装置内部的编码方式”。在不一致的体系中,会有例外的内码。

在以后的英文系统中,内码为ASCII。在繁体中文系统中,近日常用的内码为大五码(Big5)。在简体中国语言经济学系统中,内码则为国家标准码(国标代码:今后威迫供给选取GB18030标准;较旧总计机还是使用GB2312)。而统一码(Unicode)则为另一常见内码。

 

2.2 百度百科的解释

 

内码是指完全系统中使用的二进制字符编码,是关系输入、输出与系统平斯科学普及里间的调换码,通过内码能够高达通用和高成效传输文本的指标。比如MS
Word中所存款和储蓄和调用的正是内码而非图形文字。英文ASCII字符选用3个字节的内码表示,粤语字符如国家标准字符集中,GB231② 、GB1234伍 、GB1三千皆用双字节内码,GB18030(27,533中夏族民共和国字)双字节内码汉字为20,90二个,其他6,6叁13个汉字用四字节内码。

肆 、常用编码规则

4.1 单字节字符编码

 

(1)编码标准:ISO-8859-1。

(2)表明:最简易的编码规则,每二个字节直接作为二个 UNICODE
字符。比如,[0xD6, 0xD0] 那八个字节,通过 iso-8859-1
转化为字符串时,将一向得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即
“ÖД。

 

相反,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只好健康转化
0~255 范围的字符。

 

4.2 ANSI编码

 

(1)GB2312, BIG5, Shift_JIS, ISO-8859-2。

(2)把 UNICODE 字符串通过 ANSI
编码转化为“字节串”时,依据各自编码的规定,2个 UNICODE
字符恐怕转化成多少个字节或八个字节。

 

相反,将字节串转化成字符串时,也可能两个字节转化成3个字符。比如,[0xD6,
0xD0] 那多个字节,通过 GB2312 转化为字符串时,将取得 [0x4E2D]
一个字符,即 ‘中’ 字。

 

“ANSI 编码”的特点:

(1)那几个“ANSI 编码标准”都只可以处理各自语言范围之内的 UNICODE 字符。

(2)“UNICODE 字符”与“转换出来的字节”之间的关联是人为规定的。

 

4.3 UNICODE编码

 

(1)编码标准:UTF-8, UTF-16, UnicodeBig。

(2)与“ANSI 编码”类似的,把字符串通过 UNICODE
编码转化成“字节串”时,二个 UNICODE 字符恐怕转化成一个字节或四个字节。

 

与“ANSI 编码”不一样的是:

(1)那些“UNICODE 编码”能够处理全体的 UNICODE 字符。

(2)“UNICODE 字符”与“转换出来的字节”之间是能够经过测算获得的。

 

咱俩其实没有要求去追究每一个编码具体把某三个字符编码成了哪多少个字节,大家只供给明白“编码”的定义就是把“字符”转化成“字节”就足以了。对于“UNICODE
编码”,由于它们是能够经过测算得到的,因而,在卓殊的场子,大家能够去明白某一种“UNICODE
编码”是何等的平整。

三 、字符编码分类总计

上面从计算机对多国语言援救的角度来计算字符编码。

 

3.1 ASCII编码

 

以下来自“维基百科”:

ASCII(American Standard Code for Information
Interchange,美利坚联邦合众国音讯沟通标准代码)是依照拉丁字母的一套电脑编码系统。它至关心珍贵要用以呈现现代保加海法语,而其扩展版本EASCII则可以勉强显示其余西欧语言。它是当今最通用的单字节编码系统(然而有被UniCode追上的一望可知),并一如既往国际标准ISO/IEC
646。

ASCII第二回以专业标准的型态发布是在壹玖柒零年,最终一遍立异则是在一九八六年,于今停止共定义了1贰16个字符;当中叁11个字符不可能呈现(那是以明日操作系统为依归,但在DOS形式下可兆示出部分诸如笑脸、扑克牌花式等8-bit符号),且那三十个字符多数都已是陈废的控制字符。控制字符的用途首假诺用来操控已经处理过的文字。在三十几个字符之外的是九十三个可兆示的字符,包涵用键盘敲下空白键所发生的空白字符也算2个可展现字符(展现为空白)。

ASCII表:见http://zh.wikipedia.org/zh-cn/ASCII

 

ASCII缺点:

ASCII的最大缺点是只可以显示2几个主旨拉丁字母、阿拉伯数字和英式标点符号,由此只可以用来显示现代米利坚马耳他语(而且在拍卖罗马尼亚语当中的外来词如naïve、café、élite等等时,全数重音符号都不得不去掉,即便那样做会违反拼写规则)。而EASCII即使缓解了部份西欧语言的展现难点,但对越来越多其余语言仍然无所适从。由此今后的苹果电脑已经放任ASCII而转用Unicode。

 

最早的英文DOS操作系统的类别内码是:ASCII。总计机那时候只协理罗马尼亚语,别的语言不可知在电脑存款和储蓄和出示。

 

在该阶段,单字节字符串使用3个字节存放一个字符(SBCS,Single Byte
Character System)。如:”鲍勃123″占多少个字节。

 

3.2 ANSI编码

 

为使总计机接济更多语言,日常采用0x800~xFF范围的1个字节来代表3个字符。比如:汉字
‘中’ 在粤语言操作系统中,使用 [0xD6,0xD0]那八个字节存款和储蓄。

 

分裂的国度和地域制定了区别的正经,由此发出了GB2312,BIG5,JIS等个别的编码标准。这几个应用一个字节来代表2个字符的各样汉字延伸编码格局,称为
ANSI 编码。在简体中国语言经济学系统下,ANSI 编码代表 GB2312
编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

 

不等 ANSI
编码之间互不包容,当消息在国际间交换时,不可能将属于三种语言的文字,存款和储蓄在同一段
ANSI 编码的文件中。

 

普通话DOS、普通话/日文Windows 95/98时期系统内码使用的是ANSI编码(本地化)

 

在动用ANSI编码辅助多语言阶段,每一个字符使用1个字节或五个字节来代表(MBCS,Multi-Byte
Character
System),由此,那种方式存放的字符也被称作多字节字符。比如,”汉语123″
在华语 Windows 95
内部存款和储蓄器中为五个字节,各种汉字占一个字节,各种英文和数字字符占二个字节。

 

在非 Unicode
环境下,由于差异国度和地面选拔的字符集不均等,很大概现身一点都不大概平常彰显全数字符的气象。微软集团应用了代码页(Codepage)转换表的技巧来过渡性的有的化解这一题目,即因而点名的转移表将非
Unicode 的字符编码转换为同一字符对应的系统里头使用的 Unicode
编码。能够在“语言与区域设置”中精选贰个代码页作为非 Unicode
编码所利用的默许编码格局,如936为简体中文GBK,950为宋体粤语Big5(皆指PC上运用的)。在那种景况下,一些非斯洛伐克共和国(The Slovak Republic)语的亚洲语言编写的软件和文书档案很恐怕出现乱码。而将代码页设置为对应语言普通话处理又会出现难点,这一情景不能幸免。从根本上说,完全选择统一编码才是消除之道,但日前尚不能够做到这点。

  代码页技术今后常见为种种平台所采纳。UTF-7 的代码页是6伍仟,UTF-8
的代码页是65001。

 

3.3 Unicode编码

 

为了使国际间信息交换进一步有利于,国际协会制定了 UNICODE
字符集,为各个语言中的每3个字符设定了统一并且唯一的数字编号,以满意跨语言、跨平台进行文本转换、处理的必要。

 

Unicode字符集能够简写为UCS(Unicode Character
Set)。早期的unicodeUnicode标准有UCS-二 、UCS-4的说教。UCS-2用八个字节编码,UCS-4用多少个字节编码。

 

在 UNICODE 被应用之后,计算机存放字符串时,改为寄放每种字符在 UNICODE
字符集中的序号。最近电脑一般选拔 2 个字节(16位)来存放二个序号(DBCS,Double Byte Character
System),由此,那种格局存放的字符也被称作宽字节字符。比如,字符串
“普通话123” 在 Windows 三千 下,内部存款和储蓄器中实际存放的是 六个序号,一共11个字节。

 

Unicode字符集包罗了各类语言中利用到的全部“字符”。用来给 UNICODE
字符集编码的正式有很各样,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle,
UnicodeBig 等。

五 、编码的界别

5.1 GB2312、GBK和GB18030

 

(1)GB2312 

 

当中华人民共和国人们获取总括机时,已经远非得以利用的字节状态来表示汉字,况且有五千五个常用汉字须要保留,于是想到把那三个ASCII码中127号未来的奇异符号们向来撤销掉,
规定:四个稍低于127的字符的意思与原本一样,但八个超过127的字符连在联合署名时,就意味着壹在那之中华夏族民共和国字,前边的多少个字节(称之为高字节)从0xA1用到0xF7,后边一个字节(低字节)从0xA1到0xFE,那样大家就能够构成出大致8000四个简体汉字了。在这一个编码里,大家还把数学符号、亚特兰洲大学希腊共和国的字母、日文的假名们都编进去了,连在
ASCII
里本来就某些数字、标点、字母都统统重新编了八个字节长的编码,那正是常说的”全角”字符,而本来在127号以下的那贰个就叫”半角”字符了。那种汉字方案叫做
“GB2312″。GB2312 是对 ASCII 的国语扩大。包容ASCII。

 

(2)GBK 

 

而是中华人民共和国的汉字太多了,我们快速就就发现有为数不少人的人名没有艺术在此间打出来,不得不继续把
GB2312
没有应用的码位找出来用上。后来依然不够用,于是干脆不再须要低字节一定是127号过后的内码,只要第三个字节是超越127就固定表示那是二其中国字的开首,不管前边跟的是或不是扩展字符集里的情节。结果扩张之后的编码方案被称为
“GBK” 标准,GBK 包蕴了 GB2312
的有着剧情,同时又扩张了近两千0个新的汉字(包涵繁体字)和标记。

 

(3)GB18030 

 

新生少数民族也要用电脑了,于是大家再推而广之,又加了几千个新的少数民族的字,GBK
扩成了 GB18030。从此以往,中华民族的学问就足以在电脑时代中继承了。 

 

神州的程序员们观望这一文山会海汉字编码的行业内部是好的,于是通称他们叫做
“DBCS”(Double Byte Charecter Set
双字节字符集)。在DBCS连串专业里,最大的特征是两字节长的方块字字符和一字节长的英文字符并存于同一套编码方案里,由此他们写的次序为了协理普通话处理,必需要专注字串里的每一个字节的值,借使这些值是超越127的,那么就以为三个双字节字符集里的字符出现了。在那种境况下,”1个中华夏族民共和国字算七个英文字符!”。不过,在Unicode环境下却不用总是那样。 

 

5.1 Unicode和BigEndianUnicode

 

那多个指令存款和储蓄顺序差异,如”A”的Unicode编码为6500,而BigEndianUnicode编码为0065。

 

5.2 UTF-7、UTF-8和UTF-16

 

在Unicode里,全部的字符被同等看待。汉字不再利用“七个扩充ASCII”,而是选择“二个Unicode”,注意,以往的方块字是“2个字符”了,于是,拆字、计算字数这么些标题也就大势所趋的缓解了。

 

然而,那么些世界不是非凡的,不可能在一夜之间全部的系统都使用Unicode来处理字符,所以Unicode在出生之日,就亟须考虑3个严峻的难题:和ASCII字符集之间的不包容难题。 

 

大家知晓,ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,那就造成了一个可怜大的题材:以前处理ASCII的那套机制无法被用来处理Unicode了。

 

另1个更为严重的题材是,C语言使用’\0’作为字符串结尾,而Unicode里恰恰有为数不少字符都有三个字节为0,那样一来,C语言的字符串函数将不恐怕不奇怪处理Unicode,除非把世界上全体用C写的程序以及她们所用的函数库全部换掉。

 

于是,比Unicode更伟大的东东诞生了,之所以说它更宏大是因为它让Unicode不再存在于纸上,而是真正的留存于大家大家的微处理器中。这就是:UTF。

 

UTF= UCS Transformation Format,即UCS转换(传输)格式。

它是将Unicode编码规则和电脑的骨子里编码对应起来的一个条条框框。未来风行的UTF有2种:UTF-8和UTF-16。

 

那二种都以Unicode的编码实现。

 

5.2.1 UTF-8

 

UCS-2编码(16进制)   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 110001
001001,用那些比特流依次代替模板中的x,获得:11100110 101一千1
一千1001,即E6 B1 89。

 

可知UTF-8是变长的,将Unicode编码为00000000-0000007F的字符,用单个字节来代表;
00000080-000007FF的字符用七个字节表示;00000800-0000FFFF的字符用3字节表示。因为方今截至Unicode-16规范没有点名FFFF以上的字符,所以UTF-8最多是采纳三个字节来代表3个字符。但理论上的话,UTF-8最多需求用6字节表示1个字符。 

 

UTF-8兼容ASCII。

 

5.2.2 UTF-16(标准的Unicode成为UTF-16)

 

UTF-16和下面提到的Unicode本人的编码规范是均等的。

 

UTF-16以15人为单元对UCS举行编码。对于小于0x壹仟0的UCS码,UTF-16编码就等于UCS码对应的16个人无符号整数。对于十分的大于0x一千0的UCS码,定义了三个算法。可是由于实在利用的UCS2,大概UCS4的BMP必然小于0x10000,所以就当前而言,能够认为UTF-16和UCS-2基本相同。但UCS-一头是二个编码方案,UTF-16却要用以实际的传输,所以就不得不考虑字节序的题材。

 

UTF-16不兼容ASCII。

 

5.2.3 UTF-7

 

UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Format,简写成
UTF)) 是一种可变长度字元编码情势,用以将 Unicode 字元以 ASCII
编码的字元串来展现,可以使用在电子邮件传输之类的应用。

 

UTF-7并非Unicode标准之一。想要详细摸底的能够查占卜关资料。

肆 、常用编码规则

4.1 单字节字符编码

 

(1)编码标准:ISO-8859-1。

(2)表明:最简便易行的编码规则,每1个字节间接作为三个 UNICODE
字符。比如,[0xD6, 0xD0] 那五个字节,通过 iso-8859-1
转化为字符串时,将一贯拿走 [0x00D6, 0x00D0] 两个 UNICODE 字符,即
“ÖД。

 

恰恰相反,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只可以健康转化
0~255 范围的字符。

 

4.2 ANSI编码

 

(1)GB2312, BIG5, Shift_JIS, ISO-8859-2。

(2)把 UNICODE 字符串通过 ANSI
编码转化为“字节串”时,依据各自编码的规定,二个 UNICODE
字符大概转化成3个字节或几个字节。

 

恰恰相反,将字节串转化成字符串时,也大概五个字节转化成三个字符。比如,[0xD6,
0xD0] 那五个字节,通过 GB2312 转化为字符串时,将收获 [0x4E2D]
1个字符,即 ‘中’ 字。

 

“ANSI 编码”的特点:

(1)这一个“ANSI 编码标准”都只可以处理各自语言范围之内的 UNICODE 字符。

(2)“UNICODE 字符”与“转换出来的字节”之间的关联是人造规定的。

 

4.3 UNICODE编码

 

(1)编码标准:UTF-8, UTF-16, UnicodeBig。

(2)与“ANSI 编码”类似的,把字符串通过 UNICODE
编码转化成“字节串”时,1个 UNICODE 字符可能转化成1个字节或八个字节。

 

与“ANSI 编码”不一致的是:

(1)这几个“UNICODE 编码”能够处理全部的 UNICODE 字符。

(2)“UNICODE 字符”与“转换出来的字节”之间是能够透过总括获得的。

 

咱俩其实没有供给去追究每个编码具体把某一个字符编码成了哪多少个字节,大家只须求理解“编码”的定义就是把“字符”转化成“字节”就足以了。对于“UNICODE
编码”,由于它们是能够经过测算获得的,因而,在非凡规的场子,大家能够去询问某一种“UNICODE
编码”是怎么样的规则。

6、Unicode与UTF

Unicode是内部存款和储蓄器编码表示方案(是标准),而UTF是什么保存和传导Unicode的方案(是兑现)。

 

6.1 UTF的字节序和BOM

 

6.1.1 字节序

 

UTF-8以字节为编码单元,没有字节序的难题。UTF-16以八个字节为编码单元,在诠释一个UTF-16文本前,首先要弄领悟每一种编码单元的字节序。例如收到贰个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。要是大家接到UTF-16字节流“594E”,那么那是“奎”照旧“乙”?

 

Unicode规范中推荐的标志字节顺序的法门是BOM。BOM不是“Bill Of
Material”的BOM表,而是Byte Order 马克。BOM是二个有点小智慧的想法:

 

在UCS编码中有1个称呼”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编码了。

 

6.1.2 BOM

 

(1)BOM的来历 

 

为了鉴定区别 Unicode 文件,Microsoft 建议全体的 Unicode 文件应该以 ZERO
WIDTH NOBREAK
SPACE(U+FEFF)字符开始。那当做一个“特征符”或“字节顺序标记(byte-order
mark,BOM)”来识别文件中动用的编码和字节顺序。

 

(2)分化的系统对BOM的支撑 

 

因为有个别种类或程序不协理BOM,由此带有BOM的Unicode文件有时会带来一些题材。

 

①JDK1.5以及在此以前的Reader都不能处理带有BOM的UTF-8编码的文件,解析那种格式的xml文件时,会抛出格外:Content
is not allowed in
prolog。“对于化解措施,之后我会写篇小说专门讨论该难点。”

 

②Linux/UNIX 并没有选择 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

 

③差别的编写工具对BOM的拍卖也各不同。使用Windows自带的记事本将文件保留为UTF-8编码的时候,记事本会自动在文书开首插入BOM(就算BOM对UTF-8来说并不是必须的)。而其他众多编辑器用不用BOM是足以选拔的。UTF-捌 、UTF-16都以如此。

 

(3)BOM与XML 

 

XML解析读取XML文书档案时,W3C定义了3条规则:

 

①借使文书档案中有BOM,就定义了文本编码;

②假设文档中从不BOM,就翻开XML评释中的编码属性;

③如若上述二者都尚未,就假定XML文书档案选取UTF-8编码。

 

6.2 决定文本的字符集与编码

 

软件平时有二种途径来决定文本的字符集和编码。

 

(1)对于Unicode文本最标准的路子是检查和测试文本最伊始的多少个字节。如:

 

早先字节        Charset/encoding

 EF BB BF    UTF-8

 FE FF     UTF-16/UCS-2, little endian(UTF-16LE)

 FF FE     UTF-16/UCS-2, big endian(UTF-16BE)

 FF FE 00 00  UTF-32/UCS-4, little endian.

 00 00 FE FF  UTF-32/UCS-4, big-endia

 

(2)选拔一种相比较安全的形式来控制字符集及其编码,那正是弹出3个对话框来请示用户。

 

而是MBCS文本(ANSI)没有那些身处初叶的字符集标记,以后广大软件保存文本为Unicode时,能够挑选是或不是保存那个身处开端的字符集标记。因而,软件不应有依靠于那种途径。那时,软件能够选用一种相比安全的不二法门来控制字符集及其编码,那正是弹出贰个对话框来请示用户。

 

(3)采用协调“猜”的主意。

 

借使软件不想麻烦用户,也许它不便利向用户请示,那它只好使用本身“猜”的法子,软件能够依据总体文件的性子来困惑它或然属于哪个charset,那就很也许禁止了。使用记事本打开那一个“联通”文件就属于那种情况。(把原本属于ANSI编码的文本就是UTF-8处理,详细表明见:http://blog.csdn.net/omohe/archive/2007/05/29/1630186.aspx)

 

6.3 记事本的三种编码

 

(1)ANSI编码 

记事本暗许保存的编码格式是:ANSI,即当地操作系统暗许的内码,简体汉语一般为GB2312。那个怎么验证呢?用记事本保存后,使用Em艾德itor、EditPlus和Ultra艾德it之类的公文编辑器打开。推荐应用Em艾德itor,打开后,在又下角会显示编码:GB2312。

 

(2)Unicode编码 

用记事本另存为时,编码选用“Unicode”,用EmEditor打开该公文,发现编码格式是:UTF-16LE+BOM(有签订契约)。用十六进制格局查看,发现开始两字节为:FF
FE。这就是BOM。

 

(3)Unicode big endian 

用记事本另存为时,编码选择“Unicode”,用Em艾德itor打开该公文,发现编码格式是:UTF-16BE+BOM(有签字)。用十六进制格局查看,发现开首两字节为:FE
FF。那正是BOM。

 

(4)UTF-8 

用记事本另存为时,编码选取“UTF-8”,用Em艾德itor打开该公文,发现编码格式是:UTF-8(有签字)。用十六进制格局查看,发现开始四个字节为:EF
BB BF。这正是BOM。

五 、编码的区别

5.1 GB2312、GBK和GB18030

 

(1)GB2312 

 

当中华夏族民共和国人们获取总计机时,已经没有能够使用的字节状态来代表汉字,况且有6000四个常用汉字供给保留,于是想到把那多少个ASCII码中127号过后的奇异符号们一贯裁撤掉,
规定:3个低于127的字符的意思与原本一样,但四个高于127的字符连在共同时,就代表多少个汉字,前边的1个字节(称之为高字节)从0xA1用到0xF7,前边二个字节(低字节)从0xA1到0xFE,那样我们就足以组成出大致八千多个简体汉字了。在那个编码里,我们还把数学符号、秘Luli马希腊共和国(Ελληνική Δημοκρατία)的假名、日文的字母们都编进去了,连在
ASCII
里本来就某些数字、标点、字母都统统重新编了三个字节长的编码,这即是常说的”全角”字符,而原先在127号以下的那多少个就叫”半角”字符了。这种汉字方案叫做
“GB2312″。GB2312 是对 ASCII 的国语扩张。包容ASCII。

 

(2)GBK 

 

不过中华夏族民共和国的汉字太多了,大家相当慢就就意识有众五人的人名没有办法在那边打出来,不得不连续把
GB2312
没有应用的码位找出来用上。后来只怕不够用,于是干脆不再需求低字节一定是127号过后的内码,只要第一个字节是高于127就一定表示这是1在那之中夏族民共和国字的起初,不管前边跟的是或不是扩展字符集里的始末。结果扩大之后的编码方案被称为
“GBK” 标准,GBK 包涵了 GB2312
的拥有情节,同时又增添了近三千0个新的汉字(包涵繁体字)和标志。

 

(3)GB18030 

 

新生少数民族也要用电脑了,于是大家再扩充,又加了几千个新的少数民族的字,GBK
扩成了 GB18030。从此之后,中华民族的知识就能够在总括机时期中继承了。 

 

中华夏族民共和国的程序员们见状这一多重汉字编码的行业内部是好的,于是通称他们叫做
“DBCS”(Double Byte Charecter Set
双字节字符集)。在DBCS连串专业里,最大的特色是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因而他们写的程序为了帮助普通话处理,必须要留意字串里的每2个字节的值,假使那么些值是超出127的,那么就认为一个双字节字符集里的字符出现了。在那种场地下,”二个汉字算多少个英文字符!”。然则,在Unicode环境下却并非总是这么。 

 

5.1 Unicode和BigEndianUnicode

 

那三个指令存款和储蓄顺序分裂,如”A”的Unicode编码为6500,而BigEndianUnicode编码为0065。

 

5.2 UTF-7、UTF-8和UTF-16

 

在Unicode里,全部的字符被同仁一视。汉字不再利用“五个扩展ASCII”,而是使用“二个Unicode”,注意,未来的方块字是“1个字符”了,于是,拆字、总计字数那个标题也就任其自流的缓解了。

 

不过,那些世界不是卓越的,不也许在一夜之间全部的系统都使用Unicode来处理字符,所以Unicode在出生之日,就亟须考虑三个严苛的难题:和ASCII字符集之间的不包容难点。 

 

作者们知晓,ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,那就招致了一个可怜大的难点:从前处理ASCII的那套机制不可能被用来拍卖Unicode了。

 

另一个更为严重的标题是,C语言使用’\0’作为字符串结尾,而Unicode里恰恰有不少字符都有一个字节为0,那样一来,C语言的字符串函数将不可能符合规律处理Unicode,除非把世界上富有用C写的次序以及他们所用的函数库全体换掉。

 

于是乎,比Unicode更了不起的东东诞生了,之所以说它更伟大是因为它让Unicode不再存在于纸上,而是实际的存在于大家大家的电脑中。那正是:UTF。

 

UTF= UCS Transformation Format,即UCS转换(传输)格式。

它是将Unicode编码规则和电脑的实在编码对应起来的二个条条框框。未来风行的UTF有2种:UTF-8和UTF-16。

 

那三种都以Unicode的编码完成。

 

5.2.1 UTF-8

 

UCS-2编码(16进制)   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 1一千1
001001,用那几个比特流依次代替模板中的x,拿到:11100110 101一千1
一千1001,即E6 B1 89。

 

可知UTF-8是变长的,将Unicode编码为00000000-0000007F的字符,用单个字节来表示;
00000080-000007FF的字符用四个字节表示;00000800-0000FFFF的字符用3字节表示。因为近来截至Unicode-16规范没有点名FFFF以上的字符,所以UTF-8最多是行使叁个字节来表示七个字符。但理论上来说,UTF-8最多必要用6字节代表一个字符。 

 

UTF-8兼容ASCII。

 

5.2.2 UTF-16(标准的Unicode成为UTF-16)

 

UTF-16和地方提到的Unicode本身的编码规范是一样的。

 

UTF-16以二十位为单元对UCS进行编码。对于小于0x一千0的UCS码,UTF-16编码就等于UCS码对应的十三位无符号整数。对于相当的大于0x壹仟0的UCS码,定义了三个算法。可是由于实在应用的UCS2,或然UCS4的BMP必然小于0x10000,所以就当下而言,能够认为UTF-16和UCS-2基本相同。但UCS-3头是一个编码方案,UTF-16却要用以实际的传导,所以就只可以考虑字节序的难题。

 

UTF-16不兼容ASCII。

 

5.2.3 UTF-7

 

UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Format,简写成
UTF)) 是一种可变长度字元编码情势,用以将 Unicode 字元以 ASCII
编码的字元串来显现,能够应用在电子邮件传输之类的利用。

 

UTF-7并非Unicode标准之一。想要详细询问的能够查看有关材质。

七 、三种误解,以及乱码产生的原因和平消除决办法

7.1 误解一

 

在将“字节串”转化成“UNICODE
字符串”时,比如在读取文本文件时,大概经过互联网传输文本时,简单将“字节串”简单地看成单字节字符串,采取每“1个字节”正是“多少个字符”的艺术进行转账。

 

而其实,在非英文的条件中,应该将“字节串”作为 ANSI
字符串,选取适当的编码来取得 UNICODE
字符串,有大概“八个字节”才能获取“1个字符”。

 

日常,平素在英文环境下做开发的程序员们,简单有这种误会。

 

7.2 误解二

 

在 DOS,Windows 98 等非 UNICODE 环境下,字符串都以以 ANSI
编码的字节情势存在的。那种以字节格局存在的字符串,必须精通是哪个种类编码才能被科学地利用。那使大家形成了二个惯性思维:“字符串的编码”。

 

当 UNICODE 被帮衬后,Java 中的 String
是以字符的“序号”来储存的,不是以“某种编码的字节”来囤积的,因而曾经不存在“字符串的编码”那么些定义了。唯有在“字符串”与“字节串”转化时,或然,将二个“字节串”当成2个ANSI 字符串时,才有编码的概念。

 

众多的人都有其一误会。

 

7.3 分析与缓解

 

首先种误解,往往是导致乱码发生的因由。第①种误解,往往造费用来不难改进的乱码难点变得更扑朔迷离。

 

在此地,大家能够见见,在这之中所讲的“误解一”,即利用每“3个字节”正是“1个字符”的中间转播方法,实际上也就相同采取iso-8859-1 实行转账。由此,大家日常使用 bytes =
string.getBytes(“iso-8859-1”)
来开展逆向操作,获得原始的“字节串”。然后再选拔正确的 ANSI 编码,比如
string = new String(bytes, “GB2312”),来收获不错的“UNICODE 字符串”。

6、Unicode与UTF

Unicode是内部存储器编码表示方案(是正统),而UTF是何许保存和传导Unicode的方案(是贯彻)。

 

6.1 UTF的字节序和BOM

 

6.1.1 字节序

 

UTF-8以字节为编码单元,没有字节序的题目。UTF-16以三个字节为编码单元,在演说贰个UTF-16文本前,首先要弄通晓各种编码单元的字节序。例如收到贰个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。假使大家收起UTF-16字节流“594E”,那么那是“奎”仍旧“乙”?

 

Unicode规范中援引的记号字节顺序的措施是BOM。BOM不是“Bill Of
Material”的BOM表,而是Byte Order 马克。BOM是3个有点小智慧的想法:

 

在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编码了。

 

6.1.2 BOM

 

(1)BOM的来历 

 

为了鉴定识别 Unicode 文件,Microsoft 提议持有的 Unicode 文件应当以 ZERO
WIDTH NOBREAK
SPACE(U+FEFF)字符先导。那看作叁个“特征符”或“字节顺序标记(byte-order
mark,BOM)”来鉴定识别文件中央银行使的编码和字节顺序。

 

(2)分化的系统对BOM的支撑 

 

因为部分系统或程序不协助BOM,因而带有BOM的Unicode文件有时会带来一些题材。

 

①JDK1.5以及从前的Reader都无法处理带有BOM的UTF-8编码的公文,解析那种格式的xml文件时,会抛出非常:Content
is not allowed in
prolog。“对于消除办法,之后小编会写篇小说尤其商讨该难题。”

 

②Linux/UNIX 并没有利用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

 

③不一的编纂工具对BOM的处理也各分歧。使用Windows自带的记事本将文件保留为UTF-8编码的时候,记事本会自动在文书开头插入BOM(尽管BOM对UTF-8来说并不是必须的)。而别的众多编辑器用不用BOM是足以挑选的。UTF-捌 、UTF-16都以如此。

 

(3)BOM与XML 

 

XML解析读取XML文书档案时,W3C定义了3条规则:

 

①如若文书档案中有BOM,就定义了文本编码;

②假诺文书档案中平昔不BOM,就翻开XML注解中的编码属性;

③万一上述二者都并未,就假定XML文书档案采纳UTF-8编码。

 

6.2 决定文本的字符集与编码

 

软件平日有三种途径来决定文本的字符集和编码。

 

(1)对于Unicode文本最专业的途径是检查和测试文本最伊始的多少个字节。如:

 

始发字节        Charset/encoding

 EF BB BF    UTF-8

 FE FF     UTF-16/UCS-2, little endian(UTF-16LE)

 FF FE     UTF-16/UCS-2, big endian(UTF-16BE)

 FF FE 00 00  UTF-32/UCS-4, little endian.

 00 00 FE FF  UTF-32/UCS-4, big-endia

 

(2)选用一种相比较安全的点子来控制字符集及其编码,这就是弹出多少个会话框来请示用户。

 

而是MBCS文本(ANSI)没有那些身处早先的字符集标记,现在广大软件保存文本为Unicode时,能够选取是或不是保存那个身处开端的字符集标记。因而,软件不该借助于那种途径。那时,软件能够运用一种相比安全的法门来控制字符集及其编码,那正是弹出贰个会话框来请示用户。

 

(3)选取协调“猜”的方法。

 

要是软件不想麻烦用户,大概它不便宜向用户请示,那它只可以动用协调“猜”的措施,软件能够依据整个文件的性状来嫌疑它也许属于哪个charset,那就很恐怕禁止了。使用记事本打开那么些“联通”文件就属于那种景观。(把本来属于ANSI编码的文件正是UTF-8处理,详细表明见:http://blog.csdn.net/omohe/archive/2007/05/29/1630186.aspx)

 

6.3 记事本的二种编码

 

(1)ANSI编码 

记事本暗中同意保存的编码格式是:ANSI,即当地操作系统私下认可的内码,简体中文一般为GB2312。这一个怎么验证呢?用记事本保存后,使用Em艾德itor、艾德itPlus和Ultra艾德it之类的文件编辑器打开。推荐应用Em艾德itor,打开后,在又下角会彰显编码:GB2312。

 

(2)Unicode编码 

用记事本另存为时,编码选拔“Unicode”,用Em艾德itor打开该公文,发现编码格式是:UTF-16LE+BOM(有签字)。用十六进制格局查看,发现开端两字节为:FF
FE。那正是BOM。

 

(3)Unicode big endian 

用记事本另存为时,编码选择“Unicode”,用Em艾德itor打开该公文,发现编码格式是:UTF-16BE+BOM(有签字)。用十六进制情势查看,发现开头两字节为:FE
FF。那正是BOM。

 

(4)UTF-8 

用记事本另存为时,编码选择“UTF-8”,用Em艾德itor打开该文件,发现编码格式是:UTF-8(有签约)。用十六进制格局查看,发现开端六个字节为:EF
BB BF。那正是BOM。

⑧ 、参考与深刻阅读学习资料

8.1 《字符,字节和编码》http://www.regexlab.com/zh/encoding.htm(强烈推荐)

8.2 《关于编码: ascii(ansi), gb-2312, unicode,
utf8》http://blog.csdn.net/omohe/archive/2007/05/29/1630186.aspx

8.3 《Ansi,UTF8,Unicode,ASCII编码的区分》http://hi.baidu.com/%D6%F0%C4%BE/blog/item/772c5944d5e77e8bb3b7dcab.html

8.4 百度宏观《Unicode》http://baike.baidu.com/view/40801.htm

8.5 《Unicode与UTF-8/UTF-16之间有甚关系或界别?》http://zhidao.baidu.com/question/52532619.html?fr=ala0

 

出处:http://polaris.blog.51cto.com/1146394/377468

七 、三种误解,以及乱码发生的因由和平消除决办法

7.1 误解一

 

在将“字节串”转化成“UNICODE
字符串”时,比如在读取文本文件时,恐怕经过互联网传输文本时,不难将“字节串”简单地作为单字节字符串,选用每“贰个字节”正是“几个字符”的主意进行中间转播。

 

而实在,在非英文的条件中,应该将“字节串”作为 ANSI
字符串,选用适当的编码来得到 UNICODE
字符串,有恐怕“五个字节”才能获取“三个字符”。

 

普通,一向在英文环境下做开发的程序员们,简单有那种误会。

 

7.2 误解二

 

在 DOS,Windows 98 等非 UNICODE 环境下,字符串都是以 ANSI
编码的字节情势存在的。那种以字节情势存在的字符串,必须领悟是哪个种类编码才能被科学地采纳。那使大家形成了2个惯性思维:“字符串的编码”。

 

当 UNICODE 被帮助后,Java 中的 String
是以字符的“序号”来存款和储蓄的,不是以“某种编码的字节”来储存的,由此曾经不存在“字符串的编码”这些概念了。只有在“字符串”与“字节串”转化时,大概,将2个“字节串”当成一个ANSI 字符串时,才有编码的定义。

 

重重的人都有其一误会。

 

7.3 分析与缓解

 

第二种误解,往往是致使乱码发生的来头。第二种误解,往往造开支来简单校对的乱码难题变得更扑朔迷离。

 

在那边,大家得以看看,个中所讲的“误解一”,即选取每“2个字节”正是“叁个字符”的转折方法,实际上也就一律接纳iso-8859-1 实行转向。因而,我们平日使用 bytes =
string.getBytes(“iso-8859-1”)
来进展逆向操作,得到原始的“字节串”。然后再使用科学的 ANSI 编码,比如
string = new String(bytes, “GB2312”),来博取不错的“UNICODE 字符串”。

捌 、参考与尖锐阅读学习材质

8.1
《字符,字节和编码》http://www.regexlab.com/zh/encoding.htm(强烈推荐)

8.2 《关于编码: ascii(ansi), gb-2312, unicode,
utf8》http://blog.csdn.net/omohe/archive/2007/05/29/1630186.aspx

8.3
《Ansi,UTF8,Unicode,ASCII编码的区分》http://hi.baidu.com/%D6%F0%C4%BE/blog/item/772c5944d5e77e8bb3b7dcab.html

8.4
百度百科《Unicode》http://baike.baidu.com/view/40801.htm

8.5
《Unicode与UTF-8/UTF-16之间有吗关系或界别?》http://zhidao.baidu.com/question/52532619.html?fr=ala0

 

点击链接,阅读原来的书文,请务必保留此出处http://polaris.blog.51cto.com/1146394/377468

 

 

相关文章