GBK字符集,字符编码
- [1. GBK的含义](#1. GBK的含义)
- [2. GBK字符集](#2. GBK字符集)
-
- [1.1 空余可编码位](#1.1 空余可编码位)
- [1.2 GBK字符](#1.2 GBK字符)
- [3. 字符编号](#3. 字符编号)
- [4. 字符编码](#4. 字符编码)
-
- [4.1 GBK非ASCII编码范围(该部分内容由AI生成)](#4.1 GBK非ASCII编码范围(该部分内容由AI生成))
- [4.2 GBK编码表和GB2312的对应关系](#4.2 GBK编码表和GB2312的对应关系)
- [5. 使用编辑器查看](#5. 使用编辑器查看)
-
- [5.1 使用vscode查看](#5.1 使用vscode查看)
- [5.2 使用Sublime Text查看](#5.2 使用Sublime Text查看)
- [6. 疑问](#6. 疑问)
-
- [6.1 GBK中的双字节编码,为什么第二个字节的编码范围,要去掉【0x7f】?](#6.1 GBK中的双字节编码,为什么第二个字节的编码范围,要去掉【0x7f】?)
- [6.2 为什么双字节编码,两个字节的编码范围,都要去掉【0xff】?](#6.2 为什么双字节编码,两个字节的编码范围,都要去掉【0xff】?)
- [6.3 第二个字节和ASCII 如何避免混淆](#6.3 第二个字节和ASCII 如何避免混淆)
1. GBK的含义
GBK的含义:GB2312 的扩展
GBK完全兼容GB2312和ASCII
GBK编码表-参考链接
按编码顺序排序:
https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
按分区顺序排序:
http://ff.163.com/newflyff/gbk-list/
2. GBK字符集
GB2312是【简体字】的字符集,无法处理繁字体和罕用字。
1983年12月,中国台湾信息产业策进会 发布Big5繁体汉字字符集,港澳台地区比较常用。
1995年,全国信息技术标准化技术委员会 发布GBK ,将GB2312和Big5两个字符集整合到一起。
整合方式是
- 完全保留GB2312的字符顺序和字符编码方式;单字节存128个ASCII字符,其他字符使用双字节存。
- GB2312编码,空余的可编码位置,存储 Big5的13060个繁体汉字;
有一些汉字,繁体和简体一样,因此这里要去掉重复的。例如【中华人民】的【中】
1.1 空余可编码位
- GB2312的双字节编码是【区】和【位】各加【0xa0】,区位各占一个字节;比如【0xa1 0xa1】
【0xa0】,即 【0b10100000 】,前面还有很多空余可编码的位置,比如【0x9f】、【0x9e】等;
区和位这些未使用的编码位置,就可以用来存big5的字符,例如【0x9f 0x9f】、【0x9f 0x9e】 - GB2312的94个区,也有很多空余的可编码位置;例如10-15区没有编码,88-94区没有编码
GBK就是利用GB2312空余的可编码位置,把Big5中的繁体字补充进去,然后再补充其他汉字和图形符号。
1.2 GBK字符
22014个字符
- 128个ASCII字符
- 21003个汉字字符,包括简体汉字、繁体汉字、汉字部首、汉字构成
- 883个非ASCII、非汉字字符,例如全角标点、全角数字、全角大小写字母
3. 字符编号
- ASCII字符的字符编号照旧 0-127;例如数字0是48,大写A是65,小写a是97;
- 21886个非ASCII字符,没有具体的编号规则。
4. 字符编码
- 依旧是单字节存128个ASCII字符,首位固定为0
- 其余21003个汉字字符和883个非ASCII、非汉字的图形符号,共21886个字符使用双字节编码。
编码范围是0x8140~0xfefe,并且去掉第二个字节的0x7f
第一个字节0x81~0xfe
第二个字节0x40~0xfe,去掉0x7f
共计23940个编码位。怎么算出来的?
4.1 GBK非ASCII编码范围(该部分内容由AI生成)
GBK字符集采用双字节变长编码 ,你提到的 0x8140~0xFEFE 是其非ASCII字符(即汉字等)的总体范围。
具体划分如下:
1. 第一个字节(高字节)范围 范围是 0x81 ~ 0xFE。
2. 第二个字节(低字节)范围 第二个字节不是连续的,它分为两部分,中间有一个断点:
- 0x40 ~ 0x7E
- 0x80 ~ 0xFE
(0x7F 被排除在外,是为了避开ASCII的DEL删除字符)
3. 可以表示多少字符 根据这两个范围,理论上可表示的码位总数为:
- 高字节有
0xFE - 0x81 + 1= 126 种可能。- 低字节有
(0x7E - 0x40 + 1) + (0xFE - 0x80 + 1)= 63 + 127 = 190 种可能。所以,总码位 = 126 × 190 = 23,940 个。
不过需要注意,这 23,940 个是码位 数量。由于 GBK 标准中部分码位是空余未定义的,实际收录的汉字和图形字符总数是
21,886 个(包含 GB2312 的 6763 个汉字,并兼容 BIG5 中 13,000 多个汉字)。
4.2 GBK编码表和GB2312的对应关系
在GBK编码表中
81 到A0 ,都是繁体汉字;
A1 到A7 ,和完全包含GB2312 的第01到第07区的字符,并且编码完全一样;
A8 和A9 ,也完全包含GB2312 的第08区和第09区的字符,并且编码完全一样;并且在这两个区前面补充了一些字符;
AA 到AF,对应GB2312的第10区到第15区,在GB2312中没有编码;
5. 使用编辑器查看
5.1 使用vscode查看
创建一个文本文件,字符编码设置为GBK,并输入简体中文、繁体中文、大写字母。
这些字符在GBK中得编码为:
简体汉字【中】:D6D0;在GB2312编码中,简体汉字【中】的编码也是D6D0
繁体汉字【華】:C841
换行符:CR+LF
大写字母:A B

再切换到 Hex Editor查看



5.2 使用Sublime Text查看


6. 疑问

6.1 GBK中的双字节编码,为什么第二个字节的编码范围,要去掉【0x7f】?
在ASCII编码中,0x7F是【控制字符del】,代表 删除。
其实不止GBK,所有的字符集,在编码时都应该避开ASCII中的控制字符,也就是0-31和127。
在GBK编码中
第一个字节的编码范围:【0x81~0xfe】,0x81,即129 已经比127大了,因此第一个字节已经避开所有控制字符了;
第二个字节的编码范围:【0x40~0xfe】,去掉0x7f。0x40,即64,大于31,避开了除删除符号的其他控制字符。
6.2 为什么双字节编码,两个字节的编码范围,都要去掉【0xff】?
0xff通常在文件开头做一些特殊的文件标记,例如UTF-16的大端小端标记。
6.3 第二个字节和ASCII 如何避免混淆
第二个字节的范围【0x40-0xfe】,去掉0x7f,也就是【0b01000000-0b11111110】,去掉0b01111111,可以0开头,也可以1开头,那么编辑器如何做到不把第二个字节和 ASCII码混淆?
编辑器是通过GBK编码的第一个字节 来避免混淆的。第一个字节的编码范围:【0x81~0xfe】。
0x81,即129 ,即0b10000001,第一个字节一定是1开头的。
编辑器遇到1开头的字节,就把这个字节和后一个字节按照一个GBK双字节编码处理,
遇到0开头的,就按照ASCII的单字节编码处理。