GB2312
GB:国标,中华人民共和国国家标准
2312:没有特别含义,只是个编号,第2312号国家标准
百度百科:https://baike.baidu.com/item/信息交换用汉字编码字符集/8074272
参考资料:
- https://qqe2.com/doc/gb2312
- https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
- http://tools.jb51.net/table/gb2312
1. 字符集
共有7573个字符。
- 128个ASCII字符
- 682个非ASCII、非汉字图形 的字符
- 6763个简体汉字,3755个一级汉字,3008个二级汉字
一级汉字就是常用汉字,二级不常用。
2. 字符编号
有两种编号方式
- 128个ASCII字符的编号方式还是从0-127
- 其余的非ASCII字符使用【区位码】的方式编号。
94个区,每个区94位,可以表示8836个字符。空余1381个区位。
【区】和【位】都是从1开始计数。
3.字符编码
两种编码方式
- 128个ASCII字符,还是使用单字节编码,8位,首位固定为0。
- 其余字符采用双字节 编码。
编码方式为:【区号 + 0xa0】 【位号 + 0xa0】
区、位各占一字节。
首位固定为1。0xa0,就是十进制160,0b10100000
例如:汉字【啊】,在第16区第1位
以下是转换后的 Markdown 表格:
| 汉字【啊】 | 区 | 位 |
|---|---|---|
| 区号和位号 | 16 | 1 |
| 区号和位号的二进制 | 0b00010000 | 0b00000001 |
| 0xA0 的二进制 | 0b10100000 | 0b10100000 |
| 相加后的结果 | 0b10110000 | 0b10100001 |
| 相加后的结果 (hex) | 0xB0 | 0xA1 |
所以汉字【啊】,在GB2312中的编码就是B0A1

4. 使用编辑器查看
4.1 汉字【啊】
- 新建一个文本文件,输入汉字【啊】,注意右下角的编码格式为GB2312

- 查看十六进制数据;可以看到,汉字【啊】,在GB2312中是双字节编码,B0A1

4.2 大写英文字母【ABC】
他们是ASCII字符集中的字符,GB2312完全兼容ASCII,在GB2312中是单字节编码:


4.3 换行符(windows环境)
敲回车键:

可以看到,windows环境下的换行符是两个字节0D,0A

4.4 全角英文字母【ABC】
注意:标点符号、数字符号和英文字母都有全角和半角的
全角A的编码:A3C1
全角B的编码:A3C2
全角C的编码:A3C3

我们手动输入这些编码:

保存后,切回text editor查看
可以看到全角字母和半角字母其实是完全不同的字符和编码,虽然表示的内容一样。

4.5 乱码(不符合GB2312的编码规则)
什么是不符合GB2312的编码规则呢
如果是单字节,那么必须是0开头; 比如0xa0,0b10100000 就不符合
如果是双字节,那么必须大于0xa0;比如 0x80 0x80,就不符合
手动输入这些十六进制数据:

保存后,转回text editor查看,可以看到展示为乱码:

注意:GB2312 字符集中不包含欧元符号 €。
€ 是在 GB2312 发布多年后才出现的货币符号(1999年欧元正式诞生,而 GB2312 是1980年制定的),因此它被收录在后续的扩展标准中:
- GBK :包含了
€,编码为0xA2E3 - GB18030 :同样包含
€,编码也是0xA2E3
5. 疑问
5.1 GB2312兼容ASCII吗
GB2312 完全兼容 ASCII(美国信息交换标准代码)。具体体现在:
- 单字节与 ASCII 一致:GB2312 中,0x00 到 0x7F 的编码与 ASCII 完全一致,用来表示英文字母、数字、标点和控制字符。
- 用最高位区分 :它采用变长编码,最高位为
0就是单字节的 ASCII 字符 ,最高位为1则表示双字节的其他非ASCII字符。
5.2 为什么区位码,要加【0xa0】,而不是加【0x80】
如果只加0x80,即0b10000000,也可以满足最高位为1,与ASCII的单字节编码严格区分开来。
原因可能是:
- 理论上,GB2312的最后一个字符是第94区第94位;
94加上0xa0后,为0b11111110,0xfe,差1就能满0b11111111;
所以原因可能是,尽可能不浪费字节空间。 - deepseek的解释:
https://chat.deepseek.com/share/fusgwysbevvn2i75s1 - 当时设计GB2312的专家,可能有他们自己其他方面的考虑。