编码理解的漫漫长路(Unicode、GBK、ISO)
Ø 那么现在开始康康都有哪些编码方式
1. ASCII
ASCII ---American Standard Code for Information Interchange,美国信息交换标准代码,
最新发表于1967年,共128个字符,7位二进制表示,详细的对应见百度百科,比较简单,此处不赘述。
2. Unicode
Unicode又被称为万国码,是计算机领域的一项业界标准,包括字符集,编码方案等等。它为每种语言的每个字符设定了统一且唯一的二进制编码,满足跨语言跨平台的文本转换和处理的要求。1990年研发,94年正式公布。
- Unicode可以理解为一个字符库,理论上包含所有可能出现的字符,两个字节表示一个字符,每个字符都有一个编号,该编号也称为码位;
- Unicode将这个库分为17个平面,从00-10 (十六进制,0x10=17),每个平面有 65536 个码位,共1114112个字符。这些平面中,第一个Unicode平面,被称为基本多语言平面,Basic Multilingual Plane,缩写BMP,其他平面称为辅助平面Supplementary Planes。
- Unicode的编码方案
重点来了!
Unicode 只是一个庞大的字符库,将字符进行了编号,在被调用前,还经过了不同的编码处理。
1) UCS
Unicersal Character Set ,通用字符集,根据 ISO 10646 标准定义。又被分为UCS-2,UCS-4,且均采用BOM机制,Bytes Order Mark 机制(确定字节流的大小端序,确定字节流的Unicode编码方案)。
UCS-2:固定使用2个字节编码,对用第一个Unicode plane。
UCS-4 :固定使用4个字节编码。
2) UTF
Unicode Transformation Format ,Unicode转换格式的意思
a) UTF-8
UTF-8 是一种变长编码方式,为什么是可变的呢,因为一个Unicode字符最大时需要3个字节表示,但有些字符,像简单的英文,只需要一个字节,在网络传输时,可以节省资源.
对于一个字符,如果一个字节可以表示,那么其最高位二进制为0;多字节,那么第一个字节的最高位起,“1”的个数就是编码后的字节数,其余字节均已10开头。(这没有为什么,就是规定而已,最开始看的帖子没有说明这点,本人就比划了一个下午,搞自闭了,希望大家别踩坑了)
具体表现方式:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
可以看到,可用来标识编码的实际位数最多31位,即除去这些1和10控制位外,x的位数,这个编码与Unicode的编码是对应的。Unicode与UTF-8在转换时,先除去高位0,再根据所剩编码的位数,决定所需的最小的UTF-8编码位数。
具体对应关系如下:
十进制 |
Unicode符号范围(16进制) |
UTF-8编码(二进制) |
0~127 |
0000 0000~0000 007F |
0xxx xxxx |
128~2047 |
0000 0080~0000 07FF |
110x xxxx 10xx xxxx |
2048~65536 |
0000 0800~0000 FFFF |
1110 xxxx 10xx xxxx 10xx xxxx |
65536~114111 |
0001 0000~0010 FFFF |
1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx |
再例如这个‘老’字,在Unicode中的码位是63796,对应的Unicode编码为F934,把它转化为二进制是1111 1001 0011 0100,转化为UTF-8编码需要三个字节表示,从低位到高位填入,1110 1111 1010 0100 1011 0100,转换为十六进制就是EFA4B4。
b) UTF-16
UTF-16使用2或4个字节编码。若码位在BMP第一平面,使用2个字节,2^16=65536,恰好可以完全表示BMP;BMP外的辅助平面,使用4个字节编码。
具体编码方式:这4个字节,即16 Bit,被称为代理对。第一部分为高位代理,或前导代理,字节范围(D800~DBFF);第二部为低位代理或后尾代理,字节范围(DC00 ~DFFF)(这部分码位在BMP中是保留的)。
辅助平面码位表示具体规则:
a) Unicode码位转化为16进制,减去0x1 0000 ,将结果扩展20位,高位不足补零。在上面我们有提到,Unicode的范围最大为0x10 FFFF,所以最大差是0x0F FFFF;
b) 将差按照高低各十位分割;
c) 高十位扩展至2个字节,再加上0xD800;低十位同样扩展至2个字节,加上0xDC00。
理解例子:
字符‘A’在BMP范围中,Unicode码位是65,十六进制为0x0041。在传输时,这里会有一个码序问题,是0x4100(小)还是0x0041(大),这个同样依据BOM机制,加入控制信号,大端序时在数据前加上FE FF,小段序则加上FF FE。
字符 在辅助平面内,Unicode码位是66368,其十六进制为0x1 0340。先将0x1 0340-0x1 0000,得到0x0 0340,扩展到20位,且分割高低十位:0000 0000 00|11 0100 0000,高位加上D800;低位加上DC00;得到结果D800 DF40。
3. ISO-8859
ISO-8859是一系列编码,由8位二进制表示,共256个字符,前128个字符与ASCII码是相同的,后128个字符,每个国家都是不一样的;参考百度百科对应关系。这里简单提一下ISO-8859-1,它是ISO-8859家族中的一位成员,又叫Latin-1,8位为一个字节,很多协议中,默认使用的是该编码;缺点是256个字符还是不够用,常和其他编码方式配合出现。
4.GB2312
GB2312 -1980 是中国国家标准总局1980年发布的《信息交换用汉子编码字符集》的标号。
共收录汉字6763个和非汉字图形字符682个,共7445个;
整个字符集分为94个区,每区94位,共8836个;
每位1个字符,区和位组合对汉字编码,称为区位码;
二进制表示字符:将区位码换算为16进制,再加上2020H,就是我们的国标码;国标码加上8080H,就是计算机机内码。
5.GBK
GBK ,”国标扩展”的字母首拼,全称为《汉字内码扩展规范》,制定于1995年12月1日;
GBK向下兼容GB 2312编码,在其基础上,使用双字节编码方案,范围为8140~FEFE(十六进制) (剔除xx7F),共23940个码位,其中21003个汉字。支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。
参考链接:
官网对照Unicode字符编码表地址:https://unicode-table.com/cn
转化查询参考地址:https://www.qqxiuzi.cn/bianma/zifuji.php
https://www.qqxiuzi.cn/bianma/Unicode-UTF.php
https://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html
https://www.cnblogs.com/leesf456/p/5317574.html
最新文章
- word2013删除下载的模板
- POJ3764 The xor-longest Path
- gulp进阶构建项目由浅入深
- Codeforces Round #227 (Div. 2) E. George and Cards set内二分+树状数组
- 【jQuery】: 定时刷新页面
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
- blur事件
- 【Beta】 第六次Daily Scrum Meeting
- DataBase MongoDB基础知识记录
- Spring Cloud 2-Bus 消息总线(九)
- Ruby学习笔记之升级ruby的版本
- Redis主从同步原理-PSYNC【转】
- 获取checkbox勾选的id
- java常见3种文件上传速度对比和文件上传方法详细代码
- linux下查询java进程以及杀掉其进程
- SQL Server CTE 递归查询全解 -- 转 学习
- 2017-2018-2 165X 『Java程序设计』课程 助教总结
- [译]Intel App Framework 3.0的变化
- Log4net用法(.config文件)
- PAT 1062 最简分数(20)(代码+思路)