1. ASCII码

1. ASCII码

字符编码,字符编码表

1. ASCII码

1>
ASCII码不包含大家输入法中的”特殊字符”和”数学字符”等,他们都属于伸张ASCII
字符

2. GBK编码

GBK实际上是ASCII的汉语扩张编码,其规则是:

1> 如果首个字节的超出127(0x7F, 0111
1111,即最高位为0),则代表从这几个字节开端的2个字节是意味着一个汉字,否则,则是一个英文ASCII码

2> GBK是兼容ASCII的

3> GBK的汉字编码占用2个字节

4> 那类编码格局统称为做 “DBCS“(Double Byte Charecter Set
双字节字符集)

 

3. Unicode编码

Unicode是为驾驭决ASCII的各项增添编码格局不统一的标题(比如GBK和黑龙江的汉字编码就不包容),而制定的使用多字节统一编码世界所有字符的编码方案,所以Unicode能突显各国的字符编码

1> Unicode编码包蕴UCS-2, UCS-4,分别用2,
4个字节表示一个字符,通用的是UCS-2

2> 由于三个字节在内存中的储存设计到字符顺序的标题

3>
Unicode表示ASCII码时,是将高位字节全置为0,所以Unicode和ASCII是不合营的

  Magic Header(by byte) Exmaple("中":0x4E2D)
小尾(LE) FF, FE FF, FE, 2D, 4E
大尾(BE) FE, FF FE, FF, 4E, 2D

 

4. UTF-8

UCS-2表示英文字母会浪费一个字节,而世界上一大半的材料都是用英文的,所以用Unicode编码举行文件传输和保留的时候就颇为浪费带宽和硬盘,
因而就有了UTF-8, UTF-16的产出来救援世界

UTF :(UCS Transfer Format)

1> UTF-8:UTF-8是一种变长的编码形式,可以用1~4个字节表示一个字符

2>
UTF-8的原码仍旧Unicode,只是其将Unicode举办了格式化编码,转化格局:

     2.1
单字节的字符(如英文),字节的第三位设为0,对于意大利语,UTF-8码只占用一个字节,和ASCII码完全相同;

     2.2
需用n个字节的字符(n>1),第四个字节的前n位设为1,第n+1位设为0,前面字节的前两位都设为10,那n个字节的其他空位填充该字符unicode码(2进制的),高位用0补足。

     如格式化字符:”中”(0x4E2D, 0100 1110 0010 1101)

     (1)
“中”占用2个字节,因为UTF-8要求多的bit来做标记,所以至少需求多余2个字节的上空来转UTF-8,先设n=3

     (2) 3个字节各自的标记bit如下:

          1 : 1110 0000

          2 : 1000 0000

          3 : 1000 0000

里头的不一致和关系,字符编码。     (3) 我们发现剩下的空的bit位数 = 4 + 6 + 6 = 16 =
2字节,刚好够放一个Unicode,依次将”中”(0100 1110 0010
1101)的2进制bit放入

          1 : 1110 0100     0xE4

          2 : 1011 1000     0xB8

          3 : 1010 1101     0xAD

     (4)
即便Unicode填入UTF-8的沙盘没说是大尾依然小尾,而是用大家例行看2进制数的逐条填入的,但那一个顺序其实是一个大尾(0x4E放在眼前转bit)

3>
Windows中,会使用BOM来标记编码顺序,UTF-8由于没有编码顺序,Windows就用BOM
= EF BB BF来代表UTF-8编码,但广大系统和软件中是不认那一个BOM的

4>
“®”字符的Unicode编码是0x00AE,在UTF-8编码中是使用2个字节的模板来编码的:C2
AE = 1100 0010 1010 1110,抽取出来就是0 0010 10 1110 = 000 1010
1110,然后高位补0 = 0000 0000 1010 1110 =
0xAE,也就是说Unicode编码高位为00的字符,在UTF-8中都得以用2字节的模版来编码,可以省去一个字节

1. ASCII码 1
ASCII码不包涵大家输入法中的”特殊字符”和”数学字符”等,他们都属于扩大ASCII
字符 2. GBK编码 GBK实际上是…

 

1>
ASCII码不包含我们输入法中的”特殊字符”和”数学字符”等,他们都属于伸张ASCII
字符

1>
ASCII码不包涵大家输入法中的”特殊字符”和”数学字符”等,他们都属于扩充ASCII
字符

UTF-8:Unicode
TransformationFormat-8bit,允许含BOM,但普通不含BOM。是用来缓解国际上字符的一种多字节编码,它对英文使用8位(即一个字节),粤语使用24为(多个字节)来编码。UTF-8包含整个世界所有国家急需采纳的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国帮衬UTF8字符集的浏览器上显得。如,要是是UTF8编码,则在洋人的英文IE上也能突显粤语,他们无需下载IE的汉语语言支持包。

澳门金沙国际 1

澳门金沙国际 2

GBK是国家标准GB2312基础上扩容后至极GB2312的正规化。GBK的文字编码是用双字节来代表的,即无论是中、英文字符均使用双字节来表示,为了分歧粤语,将其最高位都设定成1。GBK包罗全部国语字符,是国家编码,通用性比UTF8差,可是UTF8占用的数据库比GBD大。

GBK、GB2312等与UTF8之间都必须透过Unicode编码才能相互转换:

2. GBK编码

2. GBK编码

GBK、GB2312--Unicode--UTF8

GBK实际上是ASCII的粤语伸张编码,其规则是:

GBK实际上是ASCII的国语扩张编码,其规则是:

UTF8--Unicode--GBK、GB2312

1> 固然首个字节的超过127(0x7F, 0111
1111,即最高位为0),则意味从那一个字节开首的2个字节是表示一个中国字,否则,则是一个英文ASCII码

1> 即使第三个字节的超出127(0x7F, 0111
1111,即最高位为0),则代表从那一个字节先河的2个字节是意味着一个中国字,否则,则是一个英文ASCII码

对此一个网站、论坛来说,如若英文字符较多,则指出选拔UTF-8节省空间。然而现在广大论坛的插件一般只协助GBK。
简易的话,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是以此值的变现格局.而眼前那三种编码是一合营的,同一个汉字,这五个码值是全然差其余.如"汉"的uncode值与gbk就是不等同的,如若uncode为a040,gbk为b030,而uft-8码,就是把尤其值表现的格局.utf-8码完全只针对uncode来协会的,即使GBK要转UTF-8必须先转uncode码,再转utf-8就OK了.

2> GBK是兼容ASCII的

2> GBK是兼容ASCII的

详细的就见上面转的那篇文章.

3> GBK的汉字编码占用2个字节

3> GBK的汉字编码占用2个字节

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

4> 这类编码方式统称为做 “DBCS“(Double Byte Charecter Set
双字节字符集)

4> 那类编码形式统称为做 “DBCS“(Double Byte Charecter Set
双字节字符集)

那是一篇程序员写给程序员的情趣读物。所谓趣味是指可以相比轻松地问询一些原先不掌握的概念,拉长文化,类似于打RPG游戏的升级。整理那篇小说的遐思是八个难题:

 

 

问题一:
行使Windows记事本的“另存为”,能够在GBK、Unicode、Unicode big
endian和UTF-8那两种编码方式间互为转换。同样是txt文件,Windows是怎样分辨编码格局的吗?

3. Unicode编码

3. Unicode编码

自己很早前就发现Unicode、Unicode
bigendian和UTF-8编码的txt文件的始发会多出多少个字节,分别是FF、FE(Unicode),FE、FF(Unicode
bigendian),EF、BB、BF(UTF-8)。但那一个标记是基于什么标准吗?

Unicode是为着化解ASCII的各项增加编码格局不联合的难题(比如GBK和新疆的汉字编码就不包容),而制定的接纳多字节统一编码世界所有字符的编码方案,所以Unicode能突显各国的字符编码

Unicode是为驾驭决ASCII的种种扩大编码方式不统一的标题(比如GBK和江苏的汉字编码就不兼容),而制定的使用多字节统一编码社会风气具有字符的编码方案,所以Unicode能突显各国的字符编码

问题二:
前不久在网上来看一个ConvertUTF.c,落成了UTF-32、UTF-16和UTF-8那两种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这么些编码格局,我原来就明白。但这一个程序让自身多少凌乱,想不起来UTF-16和UCS2有何样关联。
查了查相关材料,总算将这一个题材弄通晓了,顺带也精晓了有的Unicode的底细。写成一篇小说,送给有过类似难题的爱侣。本文在撰写时尽量做到通俗易懂,但须要读者知道怎么样是字节,什么是十六进制。

1> Unicode编码包括UCS-2, UCS-4,分别用2,
4个字节表示一个字符,通用的是UCS-2

1> Unicode编码包罗UCS-2, UCS-4,分别用2,
4个字节表示一个字符,通用的是UCS-2

0、big endian和little endian
big
endian和littleendian是CPU处理多字节数的不等措施。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前边,仍然将49写在后面?倘使将6C写在后面,就是big
endian。假诺将49写在前头,就是little endian。

2> 由于多少个字节在内存中的储存设计到字符顺序的难点

2> 由于五个字节在内存中的储存设计到字符顺序的题材

“endian”那些词出自《格列佛游记》。小人国的内战就出自吃鸡蛋时是究竟从大洋(Big-Endian)敲开仍旧从小头(Little-Endian)敲开,由此曾爆发过六次叛乱,一个皇上送了命,另一个丢了皇位。

3>
Unicode表示ASCII码时,是将高位字节全置为0,所以Unicode和ASCII是不般配的

3>
Unicode表示ASCII码时,是将高位字节全置为0,所以Unicode和ASCII是不般配的

俺们一般将endian翻译成“字节序”,将big endian和little
endian称作“大尾”和“小尾”。

  Magic Header(by byte) Exmaple("中":0x4E2D)
小尾(LE) FF, FE FF, FE, 2D, 4E
大尾(BE) FE, FF FE, FF, 4E, 2D
  Magic Header(by byte) Exmaple("中":0x4E2D)
小尾(LE) FF, FE FF, FE, 2D, 4E
大尾(BE) FE, FF FE, FF, 4E, 2D

1、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被电脑处理。总结机应用的缺省编码格局就是总计机的内码。早期的微机应用7位的ASCII编码,为了处理汉字,程序员设计了用于简体普通话的GB2312和用于繁体普通话的big5。

 

 

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

4. UTF-8

4. UTF-8

GB2312协助的方块字太少。1995年的汉字扩张规范GBK1.0引用了21886个标志,它分为汉字区和图表符号区。汉字区包含21003个字符。

UCS-2表示英文字母会浪费一个字节,而世界上半数以上的素材都是用英文的,所以用Unicode编码举办文件传输和保存的时候就颇为浪费带宽和硬盘,
因此就有了UTF-8, UTF-16的产出来挽救世界

UCS-2代表英文字母会浪费一个字节,而世界上半数以上的素材都是用英文的,所以用Unicode编码举行文件传输和保存的时候就颇为浪费带宽和硬盘,
由此就有了UTF-8, UTF-16的面世来救援世界

从ASCII、GB2312到GBK,那几个编码方法是向下兼容的,即同一个字符在这一个方案中总是有同样的编码,后边的正儿八经支持越多的字符。在这么些编码中,英文和粤语可以统一地处理。区分普通话编码的方法是高字节的最高位不为0。根据程序员的称为,GB2312、GBK都属于双字节字符集
(DBCS)。

UTF :(UCS Transfer Format)

UTF :(UCS Transfer Format)

2000年的GB18030是代表GBK1.0的正儿八经国家标准。该专业收录了27484个汉字,同时还引用了藏文、蒙文、维吾尔文等重大的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基本功上平添了CJK扩充A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。

澳门金沙国际,1> UTF-8:UTF-8是一种变长的编码方式,可以用1~4个字节表示一个字符

1> UTF-8:UTF-8是一种变长的编码格局,可以用1~4个字节表示一个字符

CJK就是中国和东瀛韩的趣味。Unicode为了节省码位,将中国和东瀛韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC
10646-1的汉语版,相当于Unicode 1.1。

2>
UTF-8的原码仍然Unicode,只是其将Unicode举行了格式化编码,转化格局:

2>
UTF-8的原码照旧Unicode,只是其将Unicode进行了格式化编码,转化格局:

GB18030的编码选择单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全匹配的。4字节编码的码位就是录取了CJK增添A的6582个汉字。例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。

     2.1
单字节的字符(如英文),字节的第三位设为0,对于加泰罗尼亚语,UTF-8码只占用一个字节,和ASCII码完全相同;

     2.1
单字节的字符(如英文),字节的率先位设为0,对于丹麦语,UTF-8码只占用一个字节,和ASCII码完全相同;

微软提供了GB18030的升级包,但以此升级包只是提供了一套协理CJK扩充A的6582个汉字的新字体:新小篆-18030,并不改变内码。Windows
的内码依然是GBK。

     2.2
需用n个字节的字符(n>1),首个字节的前n位设为1,第n+1位设为0,前面字节的前两位都设为10,那n个字节的其他空位填充该字符unicode码(2进制的),高位用0补足。

     2.2
需用n个字节的字符(n>1),第三个字节的前n位设为1,第n+1位设为0,后边字节的前两位都设为10,那n个字节的其它空位填充该字符unicode码(2进制的),高位用0补足。

那边还有一部分细节:

     如格式化字符:”中”(0x4E2D, 0100 1110 0010 1101)

     如格式化字符:”中”(0x4E2D, 0100 1110 0010 1101)

GB2312的原文仍旧区位码,从区位码到内码,需求在高字节和低字节上各自拉长A0。

     (1)
“中”占用2个字节,因为UTF-8要求多的bit来做标记,所以至少需求多余2个字节的空间来转UTF-8,先设n=3

     (1)
“中”占用2个字节,因为UTF-8需求多的bit来做标记,所以至少要求多余2个字节的空中来转UTF-8,先设n=3

对此其他字符编码,编码单元的相继是由编码方案指定的,与endian无关。例如GBK的编码单元是字节,用多少个字节表示一个中国字。那四个字节的各样是定点的,不受CPU字节序的震慑。UTF-16的编码单元是word(双字节),word之间的依次是编码方案指定的,word内部的字节排列才会受到endian的熏陶。前面还会介绍UTF-16。

     (2) 3个字节各自的标记bit如下:

     (2) 3个字节各自的标记bit如下:

GB2312的多个字节的参天位都是1。但适合那几个原则的码位唯有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。但是那不影响DBCS字符流的解析:在读取DBCS字符流时,只要碰着高位为1的字节,就可以将下三个字节作为一个双字节编码,而不用管低字节的高位是怎么。

          1 : 1110 0000

          1 : 1110 0000

2、Unicode、UCS和UTF
眼前提到从ASCII、GB2312、GBK到GB18030的编码方法是向下包容的。而Unicode只与ASCII包容(更规范地说,是与ISO-8859-1合作),与GB码不匹配。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

          2 : 1000 0000

          2 : 1000 0000

Unicode也是一种字符编码方法,但是它是由国际公司安排,能够容纳全世界所有语言文字的编码方案。Unicode的学名是”UniversalMultiple-Octet
Coded Character Set”,简称为UCS。UCS可以用作是”Unicode
CharacterSet”的缩写。

          3 : 1000 0000

          3 : 1000 0000

根据维基百科全书()的记叙:历史上存在七个试图独立设计Unicode的团体,即国际标准化社团(ISO)和一个软件创造商的社团(unicode.org)。ISO开发了ISO
10646档次,Unicode协会开发了Unicode项目。

     (3) 大家发现剩下的空的bit位数 = 4 + 6 + 6 = 16 =
2字节,刚好够放一个Unicode,依次将”中”(0100 1110 0010
1101)的2进制bit放入

     (3) 大家发现剩下的空的bit位数 = 4 + 6 + 6 = 16 =
2字节,刚好够放一个Unicode,依次将”中”(0100 1110 0010
1101)的2进制bit放入

在1991年光景,双方都认得到世界不须要两个不般配的字符集。于是它们初阶统一双方的办事战果,并为创设一个单一编码表而协同工作。从Unicode2.0发端,Unicode项目选用了与ISO
10646-1同一的字库和字码。

          1 : 1110 0100     0xE4

          1 : 1110 0100     0xE4

眼前多少个门类仍都留存,并单独地发表各自的正规化。Unicode社团明日的新式版本是二〇〇五年的Unicode
4.1.0。ISO的新颖规范是ISO 10646-3:2003。

          2 : 1011 1000     0xB8

          2 : 1011 1000     0xB8

UCS只是规定何以编码,并从未规定怎么传输、保存这一个编码。例如“汉”字的UCS编码是6C49,我可以用4个ascii数字来传输、保存这么些编码;也可以用utf-8编码:3个延续的字节E6
B189来代表它。关键在于通讯双方都要肯定。UTF-8、UTF-7、UTF-16都是被普遍接受的方案。UTF-8的一个特意的功利是它与ISO-8859-1全然匹配。UTF是“UCS
Transformation Format”的缩写。

          3 : 1010 1101     0xAD

          3 : 1010 1101     0xAD

IETF的RFC2781和RFC3629以RFC的一定风格,清晰、明快又不失严苛地描述了UTF-16和UTF-8的编码方法。我延续记不得IETF是Internet
Engineering Task
Force的缩写。但IETF负责掩护的RFC是Internet上所有规范的功底。

     (4)
固然Unicode填入UTF-8的沙盘没说是大尾仍旧小尾,而是用我们例行看2进制数的逐条填入的,但这一个顺序其实是一个大尾(0x4E放在面前转bit)

     (4)
即便Unicode填入UTF-8的模版没说是大尾仍旧小尾,而是用我们正常看2进制数的次第填入的,但以此顺序其实是一个大尾(0x4E放在面前转bit)

2.1、内码和code page
现阶段Windows的根本已经协助Unicode字符集,那样在根本上可以支持满世界享有的语言文字。不过由于现有的雅量顺序和文档都应用了某种特定语言的编码,例如GBK,Windows不可以不协理现有的编码,而全方位改用Unicode。

3>
Windows中,会动用BOM来标记编码顺序,UTF-8由于尚未编码顺序,Windows就用BOM
= EF BB BF来代表UTF-8编码,但许多系统和软件中是不认那些BOM的

3>
Windows中,会动用BOM来标记编码顺序,UTF-8由于并未编码顺序,Windows就用BOM
= EF BB BF来代表UTF-8编码,但过多系统和软件中是不认这几个BOM的

Windows使用代码页(code page)来适应各类国家和地面。code
page可以被明白为眼前提到的内码。GBK对应的code page是CP936。

4>
“®”字符的Unicode编码是0x00AE,在UTF-8编码中是采纳2个字节的模版来编码的:C2
AE = 1100 0010 1010 1110,抽取出来就是0 0010 10 1110 = 000 1010
1110,然后高位补0 = 0000 0000 1010 1110 =
0xAE,也就是说Unicode编码高位为00的字符,在UTF-8中都可以用2字节的沙盘来编码,可以节约一个字节

4>
“®”字符的Unicode编码是0x00AE,在UTF-8编码中是应用2个字节的模版来编码的:C2
AE = 1100 0010 1010 1110,抽取出来就是0 0010 10 1110 = 000 1010
1110,然后高位补0 = 0000 0000 1010 1110 =
0xAE,也就是说Unicode编码高位为00的字符,在UTF-8中都得以用2字节的沙盘来编码,可以省去一个字节

微软也为GB18030定义了code
page:CP54936。不过由于GB18030有一部分4字节编码,而Windows的代码页只辅助单字节和双字节编码,所以这一个code
page是无力回天真正使用的。

3、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之外。

4、UTF编码

UTF-8就是以8位为单元对UCS举行编码。从UCS-2到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
10xxxxxx10xxxxxx。将6C49写成二进制是:0110 110001 001001,
用这一个比特流依次代替模板中的x,得到:1110011010110001 10001001,即E6 B1
89。

读者可以用记事本测试一下大家的编码是不是正确。要求小心,UltraEdit在开辟utf-8编码的公文文件时会自动转换为UTF-16,可能爆发模糊。你可以在设置中关掉那几个选项。更好的工具是Hex
Workshop。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。但是由于实在运用的UCS2,或者UCS4的BMP必然小于0x10000,所以就当前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用以实际的传导,所以就不得不考虑字节序的题材。

5、UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的题材。UTF-16以三个字节为编码单元,在说圣元(Synutra)个UTF-16文本前,首先要弄通晓每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收起UTF-16字节流“594E”,那么那是“奎”如故“乙”?

Unicode规范中推荐的号子字节顺序的点子是BOM。BOM不是“Bill Of
Material”的BOM表,而是Byte order 马克。BOM是一个有点小智慧的想法:

在UCS编码中有一个称呼”ZERO WIDTH
NO-BREAKSPACE”的字符,它的编码是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-BREAKSPACE”的UTF-8编码是EF BB
BF(读者可以用大家前面介绍的编码方法验证一下)。所以只要接收者收到以EF
BBBF开头的字节流,就精通那是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码格局的。

6、进一步的参考资料
本文紧要参照的素材是 “Short overview of ISO-IEC 10646 and Unicode”
()。

自身还找了两篇看上去不错的素材,不过因为自己起来的疑团都找到了答案,所以就从未有过看:

“Understanding Unicode A general introduction to the Unicode Standard”
()
“Character set encoding basics Understanding character set encodings and
legacy encodings”
()
自己写过UTF-8、UCS-2、GBK相互转换的软件包,蕴涵接纳Windows
API和不拔取Windows
API的版本。以后有时间来说,我会收拾一下停放自己的个人主页上(http://fmddlmyy.home4u.china.com)。

自家是想知道所有标题后才起初写那篇作品的,原以为一会儿就能写好。没悟出考虑措辞和调查细节开销了很长日子,竟然从中午1:30写到9:00。希望有读者能从中受益。

附录1 加以说区位码、GB2312、内码和代码页

一对朋友对小说中那句话还有难题:
“GB2312的初稿仍然区位码,从区位码到内码,要求在高字节和低字节上个别增进A0。”

我再详尽解释一下:

“GB2312的原文”是指国家1980年的一个正规《中中原人民共和国国家标准
信息调换用汉字编码字符集 基本集
GB2312-80》。这些标准用三个数来编码汉字和国文符号。第二个数称为“区”,首个数称为“位”。所以也称为区位码。1-9区是中文符号,16-55区是一级汉字,56-87区是二级汉字。现在Windows也还有区位输入法,例如输入1601得到“啊”。(这些区位输入法可以自动识别16进制的GB2312和10进制的区位码,也就是说输入B0A1一律会赢得“啊”。)

内码是指操作系统内部的字符编码。早期操作系统的内码是与语言相关的。现在的Windows在系统里头辅助Unicode,然后用代码页适应各类语言,“内码”的定义就相比模糊了。微软一般将缺省代码页指定的编码说成是内码。

内码那些词汇,并从未什么样官方的概念,代码页也只是微软这几个店铺的叫法。作为程序员,大家只要通晓它们是怎么着事物,没有要求过多地考证这一个名词。

所谓代码页(code page)就是指向一种语言文字的字符编码。例如GBK的code
page是CP936,BIG5的code page是CP950,GB2312的code page是CP20936。

Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文件文件,里面的情节是字节流:BA、BA、D7、D6。Windows应该去怎么解释它吗?

是安份守己Unicode编码解释、如故听从GBK解释、照旧按照BIG5解说,仍然按照ISO8859-1去解释?若是按GBK去解释,就会取得“汉字”四个字。依照其余编码解释,可能找不到相应的字符,也恐怕找到错误的字符。所谓“错误”是指与公事小编的本心不符,那时就生出了乱码。

答案是Windows按照方今的缺省代码页去解释文本文件里的字节流。缺省代码页可以由此控制面板的区域采纳设置。记事本的另存为中有一项ANSI,其实就是根据缺省代码页的编码方法保存。

Windows的内码是Unicode,它在技术上可以而且协理三个代码页。只要文件能表达自己行使什么编码,用户又安装了相应的代码页,Windows就能科学显示,例如在HTML文件中就可以指定charset。

部分HTML文件小编,越发是英文笔者,认为世界上所有人都应用英文,在文件中不点名charset。如若她运用了0x80-0xff之间的字符,普通话Windows又听从缺省的GBK去解释,就会产出乱码。那时只要在那个html文件中加上指定charset的口舌,例如:<meta
http-equiv=”Content-Type” content=”text/html; charset=ISO8859-1″>

倘若原笔者使用的代码页和ISO8859-1匹配,就不会见世乱码了。

再说区位码,啊的区位码是1601,写成16进制是0x10,0x01。那和计算机广泛应用的ASCII编码冲突。为了包容00-7f的ASCII编码,大家在区位码的高、低字节上个别增加A0。那样“啊”的编码就改成B0A1。大家将加过多个A0的编码也称之为GB2312编码,固然GB2312的初稿根本没涉及那点。

相关文章