从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 数据库

  • 计算机小知识

    • 简单聊聊计算机之中的时间
    • 简单聊聊字符编码
    • ASCII字符表和说明
    • ASCII的SOH的用处
    • 回车和换行
    • 汉字是怎么编码的
      • GB2312的字符集
      • 为什么使用分区
      • 区位码简单说明
      • GB2312如何存储
      • 实践:查看汉字的GB2312码
      • GBK
    • 简单聊聊Unicode
    • 手持两把锟斤拷,口中疾呼烫烫烫
    • 数据库与编码
    • 编程语言与字符编码
    • URL编码
    • Base64编码
    • 字符编码小结
    • literacy
  • 编译原理

  • 名人堂

  • 计算机基础
  • 计算机小知识
2022-12-20
目录

汉字是怎么编码的

# 16.汉字是怎么编码的

‍

本文我们简单聊聊汉字编码方案,例如GB2312

‍

# GB2312的字符集

字符编码,是对字符进行的编码,那么首先得有一个字符集,然后再去编码,就像ASCII码也是对ASCII字符集进行的编码。

那中国的字符集怎么设定呢?以GB2312为例,国家标准局用了分区管理的方式,将公布的6763个两级汉字分为94个区,每个区94位,实际上就是把汉字表示成二维数组,每个汉字在数组中的下标就是区位码(表示其属于哪个区、哪个位)。区码和位码各是两位十进制数,因此一个汉字是4个十进制数,例如“中”字位于第54区48位,区位码位5448

‍

# 为什么使用分区

为什么要分区来管理呢?ASCII编码方案多简单,不好吗?目前并未搜到为何这么设计,个人认为分区是为了方便管理。中国的汉字特别多,就好比学校中,由于学生太多,因此采用了分班管理的方式,每个班再给学生编号,这样比较好管理

感兴趣的同学,可以去国家标准网上查看GB2312的文档,国家标准|GB/T 2312-1980 (opens new window),可以在线预览文档(没找到下载按钮,无法预览)

​​​

‍

文档在线预览地址:在线预览|GB/T 2312-1980 (opens new window), 部分内容:

​​​

‍

# 区位码简单说明

我们继续来讲GB2312的区位码设计。在94个区中:

  • 01 ~ 09区:收录了除汉字外的682个字符
  • 10 ~ 15区:空白区,没有使用
  • 16 ~ 55区:收录了3755个一级汉字,按拼音排序
  • 56 ~ 87区:收录了3008个二级汉字,按部首/笔画排序,不太常用,生僻的一些汉字。
  • 88 ~ 94区:空白区

‍

我们简单看看 01 ~ 09区的字符:

​​​

图片来自非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有_哔哩哔哩_bilibili (opens new window)

‍

第16 ~ 55区的截图如下。前面我们说过 “中”字位于第54区48位,区位码位5448。读者也可以去看 在线预览|GB/T 2312-1980 (opens new window) 第22页

​​​

‍

‍

56 ~ 87区的部分截图如下:

​​​

‍

# GB2312如何存储

我们之前只讲了区位码,但没有规定怎么在计算机里存储。我们以侃字为例,侃的区位码是5709,我们将区和位分开,并转为16进制。57对应0x39, 09对应的还是0x09。然后将区码和位码分别加上A0,得到 0xD9 和 0xA9,然后合并,就是0xD90xA9

​​​

为什么要加A0:为了兼容ASCII。GB2312 是双字节编码,为了与 ASCII 码区分开,字节的第8位必须是1,所以至少要从 0x80(128, 1000 0000) 开始,但是根据上面的规定,0x80 - 0x9f 要留给控制块,所以只能从 0xA0 开始。那为什么 GB2312 编码不是从 0xA0 开始,而是 0xA1 开始呢? 因为 0xA0 正好是图形块的空格,所以就从 0xA1 编码,这就是 0xA0 的由来。

综上,一个汉字要占两个字节,两个字节均大于127。

‍

# 实践:查看汉字的GB2312码

如果你用过Python,可以用以下代码打印出侃的GB2312码

print('侃'.encode('gb2312')) # 结果为'\xd9\xa9'
1

读者也可以新建一个txt文件,然后通过IDE或者编辑器的十六进制的方式查看文件,以Sublime为例:

​​​

这里不展开,有兴趣的读者请自行上网搜索

‍

如果你在Linux下,可以使用hexdump命令:

$hexdump  侃.txt
0000000 a9d9   
1
2

‍

‍

​​

‍

# GBK

因此,在1995年,中国发布了GBK编码,其包含了GB2312的所有内容,同时新增了近20000个新的汉字(繁体字)和符号

GBK编码不再要求低字节要大于127,只要第一个字节大于127就表示是一个汉字的开始;

‍

‍

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2022/12/27 21:31:14
回车和换行
简单聊聊Unicode

← 回车和换行 简单聊聊Unicode→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式