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的专家,可能有他们自己其他方面的考虑。
相关推荐
浮江雾1 小时前
Flutter第四节------核心概念学习笔记:从基础语法到异步编程
linux·服务器·开发语言·笔记·flutter·入门·基础
ysa0510302 小时前
【板子】欧拉序
c++·笔记·算法·深度优先·图论
ljt27249606613 小时前
CPU:如何搭建完整可用计算机
人工智能·笔记
马里马里奥-3 小时前
大模型应用开发笔记03:LangChain 中间件实战
笔记·中间件·langchain
疯狂打码的少年3 小时前
【软件工程】软件开发模型:螺旋模型(风险驱动)
笔记·软件工程
笑鸿的学习笔记3 小时前
操作系统笔记之CPU、寄存器、高速缓存、寻址总线的相对位置及寄存器,高速缓存区,内存,硬盘哪个快
笔记
Turbo正则3 小时前
机器学习入门笔记 | 基础算法及其应用场景
笔记·算法·机器学习
取地址符14 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
ysa05103015 小时前
【板子】ST表
c++·笔记·算法·板子