字符编码
ASCII
- 一共128个字符的编码
- 占七位的bit位,最前面的一位统一为0
ISO-8859-1
- 扩展的ASCII编码,对 1000 0000 ~ 1111 1111 这一段进行了编码,总共能表示256个字符
- 但仍然无法表示中文
GB2312
-
是第一个汉字编码国家标准共收录汉字6763个,其中一级汉字3755个,二级汉字3008个
-
同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符
-
编码原理
- 分为
94
个区,每个区对应94
个码位则GB2312
的编码范围为0101~9494
(十进制)- 01-09区 收录除汉字外的682个字符
- 10-15区为空白区,没有使用。
- 16-55区收录3755个一级汉字,按拼音排序。
- 56-87区收录3008个二级汉字,按部首/笔画排序。
- 88-94区为空白区,没有使用。
- 加上0xA0 即为 GB2312实际编码值 二进制编码范围为
0xA1A1~0XFEFE
- GB2312采用双字节编码, 高字节表示区位,低字节表示码位
- 分为
-
example
- ‘李’ 的区位码是3278 ,32区78位, 转换成 十六进制 0x204E, 加上0xA0 = 0xC0EE
-
汉字码位与码点查询
https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
BIG5
-
BIG5采用双字节编码,高位字节使用了0x81-0xFE,低位字节使用了0x40-0x7E,及0xA1-0xFE
-
是繁体中文字符集编码,共收录13060个中文字,其中有二字为重复编码,即“兀、兀”(A461及C94A)和“嗀、嗀”(DCD1及DDFC)
-
具体分区
8140-A0FE 保留给使用者自定义字符(造字区) A140-A3BF 标点符号、希腊字母及特殊符号。其中在A259-A261,收录了度量衡单位用字:兙兛兞兝兡兣嗧瓩糎。 A3C0-A3FE 保留。此区没有开放作造字区用。 A440-C67E 常用汉字,先按笔划再按部首排序。 C6A1-F9DC 其它汉字。 F9DD-F9FE 制表符。
GBK
-
GBK编码扩展了GB2312,完全兼容GB2312编码,不兼容BIG5编码
-
编码范围
8140-FEFE,剔除xx7F码位,共23940个码位,
共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个
ANSI
- 在winodws平台 对于英文文件是
ASCII
编码,对于简体中文文件是GB2312
编码 - 在繁体中文Windows操作系统中,ANSI编码代表Big5;
- 在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码
- 不同 ANSI 编码之间互不兼容
Unicode
Unicode简介
-
Unicode是一张表,规定了每个字符对应二进制的值
-
Unicode表包含了1114112个码点,即从000000(十六进制) - 10FFFF(十六进制)
-
Unicode将码空间划分为17个平面, 从 00-10(十六进制),最高位的一个字节,每个平面有65536个码点,即两个字节
- 基本多语言平面(Basic Multilingual Plane)码点从 0000~FFFF,包含了最常用的字符
- 其中从D800到DFFF之间的码位区段是永久保留不映射到字符的
- 其他平面称为辅助平面(Supplementary Planes)
- 基本多语言平面(Basic Multilingual Plane)码点从 0000~FFFF,包含了最常用的字符
-
Unicode只是一个符号集,只规定的字符所对应的码点,并没有指定如何存储
-
unicode码点表
https://unicode-table.com/cn
UCS(Universal Character Set)
UCS-2
- 定长二个字节编码, 0000~FFFF 对应的码点范围 对应第一个Unicode平面
- 采用BOM(Byte Order Mark)机制,该机制作用如下:
- 确定字节流采用的是大端序还是小端序。
- 确定字节流的Unicode编码方案。
UCS-4
- UCS-4是定长字节的,固定使用4个字节进行编码。也采用了BOM机制。
UTF-8(Unicode Transformation Format)
-
UTF-8是一种变长编码方式,使用1-4个字节进行编码
-
完全兼容ASCII
-
编码规则
-
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码
-
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
-
unicode范围以及 对应UTF-8编码方式
Unicode范围(十六进制位数) 十进制范围 二进制范围 UTF-8编码方式 UTf-8实际可编码的位数 0000 0000 ~ 0000 007F 0~127 1-7 0xxx xxxx
(ASCII编码范围)7 0000 0080 ~ 0000 07FF 128~2047 7-11 110x xxxx 10xx xxxx 11 0000 0800 ~ 0000 FFFF 2048~65535 11-16 1110 xxxx 10xx xxxx 10xx xxxx 16 0001 0000 ~ 0010 FFFF 65536~1114111 16~21 11110xxx 10xx xxxx 10xx xxxx 10xx xxxx 21 -
Unicode规定从 0000~FFFF 为基本多语言平面,故 前三个字节为 BMP平面
-
-
举例
- '我’的 Unicode码 6211(十六进制)
- 根据范围占三个字节
6211
的二进制为110 001000 010001
- 将’我’二进制代码从低位到高位依次填入x中,不足的填入0
- UTF-8编码位:
11100110 10001000 10010001
- UTF-8编码的十六进制为 E6 88 91
- UTF-8编码位:
- '我’的 Unicode码 6211(十六进制)
UTF-16
-
UTF-16使用2或4个字节编码
-
编码规则
- 若Unicode码点在第一平面(BPM)(0x0000 ~ 0xFFFF)中,则使用2个字节进行编码。
- 若Unicode码点在其他平面(辅助平面)(0x01 0000~0x10 FFFF),则使用4个字节进行编码。
- 首先减去 0x01 0000 得到二个字节 最大值为 0x 0F FFFF,共20位有效位数
- 取高十位 扩充成 二个字节, 高十位的取值 为 D800 ~ DBFF
- 取低十位 扩充成 二个字节,低十位的取值 为 DC00 ~ DFFF
- 组合四个字节即为UTF-16编码
- 识别大端 还是小端 be,le
- 在文件前加入FE FF 采用大端序(大端在前的顺序)
- 则在文件前加入FF FE 采用小端序(小端在前的顺序)
-
举例
-
‘我’ 字的Unicode码 6211(十六进制) 位于基本平面 所以取原值
6211
-
字符
- unicode编码
0x01 0001
- 减去01 0000 , 得 0x 0 0001
- 高字节 : 0 + D800
- 低字节: 1 + DC00 = DC01
- UTF-16得编码为:
D800 DC01
(大端模式) - 小端模式
00D8 01DC
- unicode编码
-
下图为实际所得
- 大端
- 小端
- 大端
-
参考链接
- https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
- https://www.cnblogs.com/leesf456/p/5317574.html
- https://www.qqxiuzi.cn/bianma/zifuji.php