计算机编码
ASCII
- 只占用了1字节后面7位
- 包含128个字符:0111 1111
ISO-8859-1
又名Latin1/Latin-1
- 占用1字节
- 包含256个字符
GB2312
- 占用2字节
- 区位码表示:高字节表示区,低字节表示位,分为94个区,每个区包含94个位
- 包含94*94=8836个码位
01-09区:收录除汉字外的682个字符,有164个空位(9*94-682)。
10-15区:空白区,没有使用
16-55区:收录3755个一级汉字(简体),按拼音排序
56-87区:收录3008个二级汉字(简体),按部首/笔画排序
88-94区:空白区,没有使用
注:
总共编码的中文个数为6763(3755 + 3008),还有一些汉字在GB2312中没有被编码,如’镕’字,随之就出现了主流的GBK编码。
例如:'李’字的区位码为3278(表示在32区,78位)
- 将32(区)转化为十六进制为20,加上A0为C0
- 将78(位)转化为十六进制为4E,加上A0为EE
- 组合区和位,即’李’字的GB2312编码为C0EE
BIG5
繁体中文字符集编码标准,与GBK编码没有什么关系
http://www.qqxiuzi.cn/zh/hanzi-big5-bianma.php
- 占用2字节
- 高位字节:0x81-0xFE,低位字节:0x40-0x7E及0xA1-0xFE,
- 包含126*(63+94)=19782个字符,共收录13060个中文字,其中有二字为重复编码,即“兀、兀”(A461及C94A)和“嗀、嗀”(DCD1及DDFC)
8140-A0FE:保留给使用者自定义字符(造字区)
A140-A3BF:标点符号、希腊字母及特殊符号。其中在A259-A261,收录了度量衡单位用字:兙兛兞兝兡兣嗧瓩糎
A3C0-A3FE:保留。此区没有开放作造字区用
A440-C67E:常用汉字,先按笔划再按部首排序
C6A1-F9DC:其它汉字
F9DD-F9FE:制表符
GBK
扩展并完全兼容GB2312,但不兼容BIG5编码,相比于GB2312编码,GBK编码了更多汉字,如’镕’字。
GBK编码:http://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
中文的其他编码:http://www.qqxiuzi.cn/bianma/zifuji.php
- 占用2字节
- 8140-FEFE,剔除xx7F码位,共23940个码位。能表示21003个汉字
Unicode
字符对应的码点:http://unicode-table.com/cn/
一张表/一个符号集,里面包含了可能出现的所有字符,每个字符对应一个数字,这个数字称为码点(Code Point),只规定的字符所对应的码点,并没有指定如何存储。
- 包含了1114112个码点,即从000000(十六进制) - 10FFFF(十六进制)
- Unicode将码空间划分为17个平面,从00 - 10(十六进制,最高两位),即从0 - 16(十进制),每个平面有65536个码点(2^16)
第一个Unicode平面:码位从0000 - FFFF,包含了最常用的字符,该平面被称为基本多语言平面 BMP(Basic Multilingual Plane),在基本多文种平面內,从D800 - DFFF之间的码位区段是永久保留不映射到字符的。其他平面称为辅助平面(Supplementary Planes)
有两个独立的创立单一字符集的尝试:
- 国际标准化组织(ISO)的 ISO 10646 项目
- 多语言软件制造商组成的协会组织的 Unicode 项目
在1991年前后,两个项目的参与者都认识到,世界不需要两个不同的单一字符集。它们合并双方的工作成果,并为创立一个单一编码表而协同工作。两个项目仍都存在并独立地公布各自的标准,但Unicode协会和ISO/IEC JTC1/SC2都同意保持Unicode和ISO 10646标准的码表兼容,并紧密地共同调整任何未来的扩展。Unicode编码方案主要有两条主线:
- UCS:由ISO/IEC进行维护管理
- UTF:由Unicode Consortium进行维护管理
UCS
Universal Character Set,在UCS中主要有UCS-2和UCS-4。
UCS-2
- 定长2字节
- 0000(十六进制) - FFFF(十六进制)的码位范围,对应第一个Unicode平面
- 采用BOM(Byte Order Mark)机制,该机制作用如下:1. 确定字节流采用的是大端序还是小端序。2. 确定字节流的Unicode编码方案
UCS-4
- 定长4字节
- 也采用了BOM机制
UTF
Unicode Transformation Format,在UTF中主要有UTF-8,UTF-16和UTF-32。
UTF-8
UTF-8完全兼容ASCII,对于ASCII中的字符,UTF-8采用的编码值跟ASCII完全一致。UTF-8是Unicode一种具体的编码实现。UTF-8是在互联网上使用最广的一种Unicode的编码规则,因为这种编码有利于节约网络流量(因为变长编码,而非统一长度编码)。
- 变长1-4字节
Unicode码点转化为UTF-8编码规则:
① 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
② 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode符号范围 | UTF-8编码方式 | 补位数 |
---|---|---|
十六进制 | 二进制 | |
0000 0000 - 0000 007F | 0xxxxxxx | 7F=127=01111111 |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx | 7FF=2047=00000111 11111111 |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | FFFF=65535=11111111 11111111 |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 10 FFFF=1114111=00010000 11111111 11111111 |
注:二进制表示,前面为0用1个字节表示,其他前面有几个连续的1则需要几字节表示
例如:
- 字符’A’的Unicode码点为65(十进制),根据上表,在第一行范围,则字符’A’的UTF-8编码为01000001,即41(十六进制)
- 中文字符’李’的Unicode码点为26446(十进制),二进制为01100111 01001110,十六进制为674E。根据上表,在第三行范围,则将’李’二进制代码从低位到高位依次填入x中,不足的填入0。得到UTF-8编码为11100110 10011101 10001110,即E69D8E(十六进制)
UTF-16
UTF-16编码巧妙的利用了基本多语言平面内从D800 - DFFF之间的永久保留不映射到字符的码位来对辅助平面内的字符进行编码。
辅助平面码点被编码为一对16比特(四个字节)长的码元,称之为代理对(surrogate pair):
- 第一部分称为高位代理(high surrogate)或前导代理(lead surrogates),码位范围为:D800-DBFF
- 第二部分称为低位代理(low surrogate)或后尾代理(trail surrogates),码位范围为:DC00-DFFF
高位代理的码位从D800 - DBFF,而低位代理的码位从DC00 - DFFF,总共恰好为D800 - DFFF,这部分码点在第一平面内是保留的,不映射到任何字符,所以UTF-16编码巧妙的利用了这点来进行码点在辅助平面内的4字节编码。
- 不定长2或4字节
- 采用BOM机制
编码规则:
- 若Unicode码点在第一平面(BPM)中,则使用2个字节进行编码。
- 若Unicode码点在其他平面(辅助平面),则使用4个字节进行编码:
① 使用Unicode码位减去100000(十六进制),得到的值扩展20位(因为Unicode最大为10 FFFF(十六进制),减去1 0000(十六进制)后,得到的结果最大为0F FFFF(十六进制),即为20位,不足20位的,在高位加一个0,扩展至20位即可)。
② 将步骤一得到的20位,按照高十位和低十位进行分割。
③ 将步骤二的高十位扩展至2个字节,再加上D800(十六进制),得到高位代理或前导代理。取值范围是D800 - DBFF。
④ 将步骤二的低十位扩展至2个字节,再加上DC00(十六进制),得到低位代理或后尾代理。取值范围是DC00 - DFFF。
例如:
字符’A’的Unicode码点为65(十进制),十六进制表示为41,在第一平面。根据规则,UTF-16采用2个字节进行编码。表示为FE FF 00 41意味着采用了大端序,而表示为FF FE 41 00意味着采用了小端序。
字符的UTF-16编码,其码点为1016E
- 减去10000得到016E,扩展至0016E进行分割,得到高十位为00 0000 0000,得到低十位为01 0110 1110
- 高十位00 0000 0000十六进制为0000,加上D800为D800
- 低十位为01 0110 1110十六进制为016E,加上DC00为DD6E
- 综合得到D8 00 DD 6E,即UTF-16编码为D8 00 DD 6E(也可为D8 0 DD 6E)
UTF-32
- 占4字节
- 采用BOM机制
BOM(Byte Order Marker)机制 & 字节顺序标记
编码 | 十六进制 |
---|---|
UTF-8 | EF BB BF |
UTF-16(Big endian) | FE FF |
UTF-16(Little endian) | FF FE |
UTF-32(Big endian) | 00 00 FE FF |
UTF-32(Little endian) | FF FE 00 00 |
UTF-7 | 2B 2F 76和以下的一个字节:[ 38 | 39 | 2B | 2F ] 43 47 118和以下的一个字节:[ 56 | 57 | 43 | 47 ] |
en:UTF-1 | F7 64 4C |
en:UTF-EBCDIC | DD 73 66 73 |
en:Standard Compression Scheme for Unicode | 0E FE FF |
en:BOCU-1 | FB EE 28及可能跟随着FF |
GB-18030 | 84 31 95 33 |
参考:
https://www.cnblogs.com/leesf456/p/5317574.html
https://www.cnblogs.com/liupp123/articles/8023861.html