汉字是如何编码的

news/2024/10/4 15:36:01

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

GB2312 的字符集

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

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

为什么使用分区

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

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

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

区位码简单说明

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

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

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

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

第 16 ~ 55 区的截图如下。前面我们说过 “中”字位于第 54 区 48 位,区位码位 5448。读者也可以去看 在线预览 |GB/T 2312-1980 第 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'

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

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

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

$hexdump  侃.txt
0000000 a9d9   

GBK

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

exe加壳

New Project:新建项目, Open Project:打开已有项目 Save Project:保存项目 Protect:发布项目,会生成加壳以后的exe 本文来自博客园,作者:小康0,转载请注明原文链接:https://www.cnblogs.com/z13753176959/p/18250272

JGG | 严建兵团队综述生物大数据驱动作物智能设计育种

近期,华中农大严建兵团队在Journal of Genetics and Genomics上发表综述:Engineering the future cereal crops with big biological data: towards an intelligence-driven breeding by design。该文回顾了近年来在作物育种领域取得的进展,涵盖了作物农艺性状的机制、新兴技…

FDRS | 一个开源的智慧农场中继系统

分享一个智慧农业开源项目:农场数据中继系统(Farm Data Relay System, FDRS)。这是一个利用现代信息技术,如物联网(IoT)、大数据和云计算等,为农业生产提供数据支持和管理优化的系统。该系统的核心功能是收集、处理和分析农场相关数据,帮助农民更精准地进行作物种植和管…

farmOS | 一个免费开源的智慧农场管理系统

farmOS简介 farmOS 是一个基于 Web 的应用程序,用于服务器场管理、规划和记录保存。它由农民、开发人员、研究人员和组织组成的社区开发,旨在为农业数据收集和管理提供标准平台。 farmOS服务器建立在Drupal之上,这使得它模块化、可扩展和安全。farmOS Field Kit 应用程序通过…

尘封在文件夹中的GWAS和QTL定位的古老笔记

long long ago,小野记录了关于重测序基因定位和GWAS相关的笔记。打开古老的文件夹,发现有些东西依然不过时,零零散散,随意发布。QTL定位策略:群体类型:作图群体,自然群体 选材策略:全群个体分析,选择基因型分析,混合分组分析 优点:适合稀有基因研究;群体可控,目的…

拜耳推出农业生成式AI系统GenAI

近期,拜耳公布了一项开创性的试点计划,引入了一个专业的生成式人工智能(GenAI)系统,旨在提高效率,并增强农艺师的日常工作能力。利用专有的农艺数据,拜耳利用其全球农艺师网络数百年的丰富经验,训练了一个复杂的大型语言模型(LLM)。GenAI系统代表了农业技术的重大飞跃…

泛基因组比对教程

通过代码指导 Minimmap2 基因组比对和 seq-seq-pan 泛基因组比对,并在 R 中进行可视化。本教程提供了一个示例,该示例使用Heliconius butterflies中optix基因位点的两种单倍型。 教程: https://stevenvb12.github.io/代码: https://github.com/StevenVB12/Tutorial_pan_gen…

AI育种家:作物育种的基因组预测

分享一篇近期来自华中农大王旭彤老师(即SoyDNGP作者)的综述,以SoyDNGP为例。建议参考之前的推文:基于深度学习框架的基因组预测新模型SoyDNGP。摘要 人工智能(AI)与作物育种的结合代表了向数据驱动型农业实践的范式转变,旨在提高作物改良的效率和精度。本文对大豆深度神…