阅读 112

unicode中文编码表,字符集是什么

目录代码页ASCII代码lqdzfj、Latin-1 GB-xx、ANSI标准字符集和字节流Unicodeutf-8映射规则BOM代码页代码与exe的关系

代码页

代码页,也称为字符集代码。

表示映射关系。 例如,a字符如何存储在计算机中。

ASCII代码ascii:americastandardcodeforinformationinterchange

标准(基础) ASCII码,只使用了7位! [ 0,127 ] [0x 00,0x7f ]共128个数字表示的文字。

最高有效位不参与字符编码

最高有效位用作“奇偶校验”。 奇偶校验有奇校验和偶校验两种方法。

在奇数检查中(假设数据传输没有错误) 7位数据中,如果1的个数是偶数,则最高有效位补1。

使得8位字节中的1的个数为奇数。 即,如果1字节8bit中1的个数为奇数,则数据转送是正确的

这128个字,用英语说已经足够了。

lqdzfj,Latin-1 lqdzfj :除了原始ASCII使用的[ 0,127 ]外,还附加了128个字符(包括其他国家语言的某些符号)

该代码称为ISO-8859-1 Latin-1,他是符号ISO和ANSI标准的。

Latin-1,他在下面[ 0,127 ]包含了ASCII标准,在上面[ 128,255 ]扩展了几个新字符。

ASCII代码是7位容器。 Latin-1是8位容器

也就是说,他使用了一个字节的所有空间。 也就是说,没有浪费空间

所有编码的字节流都可以按Latin-1编码处理。

对于Mysql数据库,缺省情况下使用Latin-1编码

GB-xx、ANSI标准已经可以用一个字节完全表达英语了。 但是,关于中文、日语、还不能充分表达

因此,必须用2个或更多字节表示。

于是,中国人发明了GB码系列。 GB2312,GBK

日语、韩语也有各自的代码。 与GB码相似。

规则是:

,不管用多少字节编码。 如果一个字节是【0,127】,他就一定要说“ascii!

,否则,该字节必须是【128,255】; 然后,将该字节和下一个字节组合起来,形成“汉字文字”

也就是说,GB代码是向后兼容的ascii代码!

例如GB-中文、GB-日语、GB-韩语。 这意味着每个国家都有自己的编码方法。

,这些GB代码统一称为ANSI

,其实是一个东西,只是称呼不同! 例如,GB-中文代码他对应ANSI-936代码页上的两个名字,其实是一样的

GB代码统称为ANSI代码。

但是,我只知道是ANSI码还是乱码! 必须是正确的。 是哪种语言的代码?

也就是说,应该是GB-中文,还是GB-日语,必须是正确的。

也就是说,GB-中文代码和GB-日文代码不兼容! 完全对立和冲突的关系

也就是说,ANSI代码的文本不能同时有中文和日语!

所以,ANSI不是“字符编码”,而是美国的标准化团体。

各种GB-xx,其实他们之间完全不兼容,但统一命名为ANSI。 这是错误的历史性决定。

字符集字符集:规定(文字)与他对应(号码) ) )。

、通常从[0]开始,然后递增。 例如,决定0为文字(我),1为文字,2为文字)。

字节流:规定(编号)和实际存储在计算机中的字节)之间的关系

、例如,确定了映射方法。 然后,该方法将(编号2 )对应的内存字节设为(0x3f,0x2f )。

、即,该字符(好的)是存储在计算机中的0x3f、0x2f (即,占2个字节) )。

时,为ANSI代码。 他的(字符集) ()字节流!

例如,在ansi-(GB2312 )中,他的字符集总共是=2字节字符。

对于,所有字符、内存字节都是2个字节。 然后,字节流=编号。

例如,如果某个字符(编号为3 ),则他保存在计算机上的是0 x 00,0 x 03

也就是说,什么是号码,什么是字节流。 )

另一方面,unicode的(字符集)和(字节流)不是一一对应的。 需要映射算法。

Unicode Unicode (万国代码) (顾名思义,他用一种代码方式)可以表示世界上的所有字符)

首先,决定字符集。 此字符表的大小为0x 11 00 00。 (但是,现在实际使用的号码只有约0x 04 00 00个。

该字符表中,[ 0,127 ]对应于ascii表。

对应其他文字,号码小(通常,这个文字在全世界范围内

用频率较高)


字符中,的unicode编号是:20013

关键是介绍: 字节流。

如果还是使用 ANSI的映射规则, 则unicode的字节流,每个字符 都是占用3个字节!!
那么,如果我们文本里 全都是(英文字符),那么,多浪费了2倍的空间!!!

所以,对应映射规则(即对应的 字节流),其实有很多种方法!!!
utf: unicode transform format

utf-8映射规则 字符集字节流[0x0, 0x7f][0, abcdefg][0x80, 0x7ff][110, abcde] [10, abcdef][0x800, 0xffff][1110, abcd] [10, abcdef] [10, abcdef][0xffff, 0x10ffff][11110, abc] [10, abcdef] [10, abcdef] [10, abcdef]

可以看到,他是一种(变长的 字节流),目的就是: (让编号小的 占用的字节小)

图中的abcde..,表示 (可变的)bit

比如,具体看,0x80这个编号 是如何映射到 字节流上的:
他对应的是2个字节,从右侧可以看到,有11个bit 是可变的。
0x80对应到 11个bit上,是:000 1000 0000 即规则是: 把编号转到二进制,直接映射到 右侧的bit上
故,0x80的 字节流是: [110, 00010] [10, 000000]

而对应0x7ff,可以发现,他正好是11是1。 即,把右侧的bit 都占满。

即,左侧的编号:[l, r]。 (假设右侧有x个bit) , 则有: r = (1 << bit) - 1
(当然,最后一行即4字节 那一组 除外,因为,unicode码 最大是0x10ffff)

可以发现,这种映射 并不是“双射”!!!

比如,拿第二组来看。
他右侧的11个bit,其实只使用了:>= 0x80的数, 而对于: 这11个bit里,< 0x80的,是没有使用的!!!

比如说: [110, 00000] [10, 000000] 这个字节流,就是未定义 未使用的!!!

(即,第二组 未使用:0x80个,第三组 未使用:0x800个!)
虽然浪费了,但是,这样的设计,对于两者间的转换,通过“移位操作”,就可以快速的进行 转换。

分析下,这种字节流的设计。

一个字符,大概可以分为2类:

ascii。 (则他只有1个字节,且该字节,第1位是0)非ascii。 (该字符有多个字节,假设他是有:n个字节)
[n个1, 0, abc..] [10, abcdef] [10, abcdef]

故,一个字节:

要么是[0, ...],说明他是一个ascii要么是[n个1, 0, ..] n>=2,说明,(该字节 + 加后面的字节)一共组成n个字节,来表示一个字符。否则,就是[10, ...],说明,该字节 不是 一个字符的 开头字节!!!

比如,已知在unicode码里,字符(中),对应的是:20013

20013 = 0x 4e 2d,他处在第三组[0x800, 0xffff]里。 即3个字节。

第三组是:[0x800, 0xffff] 对应:[1110, abcd] [10, abcdef] [10, abcdef]

右侧,有16个bit,0x4e 2d转换成16个bit后,是:0100, 1110, 0010, 1101,然后补充到右侧的abc..里

字节流为: [1110, 0100] [10, 111000] [10, 101101]。10进制为(228, 184, 173)

所以,比如,你的ide里,选择的 “编码方式”是: utf-8。

const char * s = "中";strlen(s) == 3;(U char)s[0] = 228;(U char)s[1] = 184;(U char)s[2] = 173; BOM

由于,utf有很多种:utf-8, utf-16, ...。
那么,如果不知道是什么编码方式,只能一个个的实验。

于是,出现了BOM byte order mark,标记头
在整个文件的最开头,加入FF FE等 (在utf字节流中,一定不存在FF, FE...)

即出现了:utf-8 with bom 和 utf-8 no bom

(一般,使用no bom)

代码页

946: gb2312

65001: utf-8

编码 与 exe的关系

其实,你的编码方式(gb,utf),跟exe运行 没什么关系! 因为,exe就是:从(存储空间)的二进制数据 读出数据而且!!

编码方式,和ide的关系 很大。

比如,你的ide里,选择的是:utf-8。

那么,你的程序,在编译成exe后。程序里的数据,就是以(utf-8)格式 转换成 二进制后,存储在计算机里的!!!

开朗的酒窝运行exe时,exe只是从存储器里 读出这些二进制数据(不存在 格式问题!)

但是,这些二进制数据,以哪种方式,展示到你的屏幕上。 这需要你去指定。(比如,cmd里的CHCP 65001,即将二进制数据 以utf-8来展示)

因此,编码问题: (要么是,如何将字符转到二进制存储)(要么是,如何将二进制数据 转到字符来展示) 这都是程序运行没有关系


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐