5.GBK字符集,字符编码

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://qqe2.com/doc/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两个字符集整合到一起。

整合方式是

  1. 完全保留GB2312的字符顺序和字符编码方式;单字节存128个ASCII字符,其他字符使用双字节存。
  2. GB2312编码,空余的可编码位置,存储 Big5的13060个繁体汉字;
    有一些汉字,繁体和简体一样,因此这里要去掉重复的。例如【中华人民】的【中】

1.1 空余可编码位

  1. GB2312的双字节编码是【区】和【位】各加【0xa0】,区位各占一个字节;比如【0xa1 0xa1】
    【0xa0】,即 【0b10100000 】,前面还有很多空余可编码的位置,比如【0x9f】、【0x9e】等;
    区和位这些未使用的编码位置,就可以用来存big5的字符,例如【0x9f 0x9f】、【0x9f 0x9e】
  2. GB2312的94个区,也有很多空余的可编码位置;例如10-15区没有编码,88-94区没有编码

GBK就是利用GB2312空余的可编码位置,把Big5中的繁体字补充进去,然后再补充其他汉字和图形符号。

1.2 GBK字符

22014个字符

  1. 128个ASCII字符
  2. 21003个汉字字符,包括简体汉字、繁体汉字、汉字部首、汉字构成
  3. 883个非ASCII、非汉字字符,例如全角标点、全角数字、全角大小写字母

3. 字符编号

  1. ASCII字符的字符编号照旧 0-127;例如数字0是48,大写A是65,小写a是97;
  2. 21886个非ASCII字符,没有具体的编号规则。

4. 字符编码

  1. 依旧是单字节存128个ASCII字符,首位固定为0
  2. 其余21003个汉字字符和883个非ASCII、非汉字的图形符号,共21886个字符使用双字节编码。
    编码范围是0x8140~0xfefe,并且去掉第二个字节的0x7f
    第一个字节0x81~0xfe
    第二个字节0x40~0xfe,去掉0x7f
    共计23940个编码位。怎么算出来的?

4.1 GBK非ASCII编码范围(该部分内容由AI生成)

GBK非ASCII编码范围

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编码表中

81A0 ,都是繁体汉字;

A1A7 ,和完全包含GB2312 的第01到第07区的字符,并且编码完全一样;

A8A9 ,也完全包含GB2312 的第08区和第09区的字符,并且编码完全一样;并且在这两个区前面补充了一些字符;

AAAF,对应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的单字节编码处理。

相关推荐
阿米亚波1 小时前
【C++ 异常处理】try-catch
开发语言·c++·笔记·try-catch
XS0301062 小时前
GitHub/Gitee 团队协作笔记
笔记·gitee·github
祁白_2 小时前
WebShell工具流量特征分析
笔记·web安全·流量特征·webshell工具
小陈的进阶之路2 小时前
爬虫三大解析库:lxml, jsonpath, bs4
开发语言·笔记·python
xieliyu.3 小时前
Java 文件IO :File 文件类、字节流、字符流讲解
java·ide·笔记·javaee
天天爱吃肉82183 小时前
行业笔记|高压连接器瞬态接触退化通用检测方法论
人工智能·笔记·python·功能测试·学习·汽车
FENRON3 小时前
艺术涂料品牌怎么选?从五个维度拆解筛选逻辑
经验分享·笔记·其他
九硕智慧建筑一体化厂家3 小时前
无线动能开关|楼道电梯厅智能照明改造方案
运维·笔记·智慧城市
今儿敲了吗4 小时前
CO——指令系统
笔记