4. GB2312字符集,以及字符编码

GB2312

GB:国标,中华人民共和国国家标准

2312:没有特别含义,只是个编号,第2312号国家标准

百度百科:https://baike.baidu.com/item/信息交换用汉字编码字符集/8074272

参考资料:

  1. https://qqe2.com/doc/gb2312
  2. https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
  3. http://tools.jb51.net/table/gb2312

1. 字符集

共有7573个字符。

  1. 128个ASCII字符
  2. 682个非ASCII、非汉字图形 的字符
  3. 6763个简体汉字,3755个一级汉字,3008个二级汉字
    一级汉字就是常用汉字,二级不常用。

2. 字符编号

有两种编号方式

  1. 128个ASCII字符的编号方式还是从0-127
  2. 其余的非ASCII字符使用【区位码】的方式编号。

94个区,每个区94位,可以表示8836个字符。空余1381个区位。

【区】和【位】都是从1开始计数。

3.字符编码

两种编码方式

  1. 128个ASCII字符,还是使用单字节编码,8位,首位固定为0。
  2. 其余字符采用双字节 编码。
    编码方式为:【区号 + 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 汉字【啊】

  1. 新建一个文本文件,输入汉字【啊】,注意右下角的编码格式为GB2312
  2. 查看十六进制数据;可以看到,汉字【啊】,在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的单字节编码严格区分开来。

原因可能是:

  1. 理论上,GB2312的最后一个字符是第94区第94位;
    94加上0xa0后,为0b11111110,0xfe,差1就能满0b11111111;
    所以原因可能是,尽可能不浪费字节空间。
  2. deepseek的解释:
    https://chat.deepseek.com/share/fusgwysbevvn2i75s1
  3. 当时设计GB2312的专家,可能有他们自己其他方面的考虑。
相关推荐
软件技术NINI42 分钟前
盗墓笔记html+css+js 2页
css·笔记·html
智者知已应修善业1 小时前
【用D触发器组成000-001-010-011-100】2025-6-7
驱动开发·经验分享·笔记·硬件架构·硬件工程
纪念 2291 小时前
数据库基础
数据库·笔记·学习方法
AnsonNie1 小时前
处理提示“wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。”【笔记】
笔记
山城码农笑松哥2 小时前
Redis 8.8 新特性实操笔记:原生数组、INCREX 限流、XNACK 流处理
redis·笔记·junit
xqqxqxxq2 小时前
SQL 字段约束笔记
android·笔记·sql
神龙天舞20014 小时前
CMake构建学习笔记-通用的CMake构建脚本
笔记·学习
Seven_Ting4 小时前
React-Hooks笔记
前端·笔记·react.js
AOwhisky5 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙
腾飞开源5 小时前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署