当前位置: 首页 > news >正文

字库原理 GB2312-80

这篇文章介绍的是 在嵌入式开发中 常常会遇见的 中文字体点阵字库(如汉字库) 的核心编码原理:区位码 + 偏移计算 + 内存映射。我们将会介绍 GB2312-80 字库的工作机制。

📘什么是 GB2312-80?

GB2312-80 是中国国家标准定义的一套简体汉字编码表,它包含:

项目数量
汉字区数94 区(01H~5FH
每区位数94 位(01H~5FH
编码总数94 × 94 = 8836 个位置(包含 6763 个汉字 + 其它符号)

🧩区位码原理

每个汉字都有一个对应的 区号位号统称区位码):

示例:汉字 “中” 的区位码是: 5448

📌 在计算机中的存储方式:

  • 汉字编码占两个字节
  • 高字节 存储区号 + 偏移(0xA0
  • 低字节 存储位号 + 偏移(0xA0

那么,为什么是加 0xA0(即十进制 160)?

为了避开 ASCII 的控制字符(0x00~0x1F),并使高位始终为 1,避免与 ASCII 字符混淆。

字模文件的存储结构(点阵数据)

请添加图片描述

  • 每个汉字对应 一个点阵图
  • 比如 16×16 点阵:每个汉字占用 32 字节(16 行 × 每行 2 字节)
  • 汉字按区位码顺序排列
  • 偏移 = ((区号 - 0xA1) × 94 + (位号 - 0xA1)) × 每字节数

🧮 偏移量计算公式详解

在图中我写了计算公式:

offset = ((区号 - 0xA1) * 94 + (位号 - 0xA1)) * 每个汉字所占字节数
✅ 示例:汉字“中”

“中”的编码是 0xD6D0,即:

  • 高字节:D6 → 区号 = D6H = 214
  • 低字节:D0 → 位号 = D0H = 208
offset = ((0xD6 - 0xA1) * 94 + (0xD0 - 0xA1)) * 32= ((0x35) * 94 + 0x2F) * 32= (53 * 94 + 47) * 32= 5029 * 32= 160928

所以,“中” 对应的点阵字模在字库文件中的偏移地址是 160928 字节 处起始的 32 字节数据


🧾 位图数据的存储方式

以 16x16 点阵为例:

每行 16 个像素,2 字节(16 位)
一共 16 行,共 32 字节
每个 bit 表示一个像素点(0=背景,1=前景)

读取点阵流程(示意):
uint8_t buf[32];
FILE* f = fopen("HZK16", "rb");
fseek(f, offset, SEEK_SET);
fread(buf, 1, 32, f);
fclose(f);

然后将 buf 中的每个 bit 按行绘制在 LCD/LED 屏上,即可显示汉字。

点阵显示效果(示意):
0x00 0x7E00000000 01111110↑↑↑↑↑↑↑↑ 行10x18 0x1800011000 00011000↑↑↑↑↑↑↑↑ 行2... 以此类推,共16

综上。汉字字库通过 区位码映射 + 偏移计算 + 点阵数据读取,实现了在嵌入式系统(如 STM32)中汉字的快速显示,是图形化界面和字符屏的基础。

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

http://www.dtcms.com/a/353490.html

相关文章:

  • rk3588开发板最新kernel6.1下载(RK3588SDK源码下载)和环境搭建
  • 基于结构化码本的分层DNN框架用于高效语音增强
  • 第18章|变量:把数据装进“盒子”的正确方式
  • 【STM32】将 FreeRTOS移植到STM32F103RCT6 详细流程
  • 【开发配置】GitLab CR(Code Review)规则配置清单
  • 论文翻译:BRILLM: BRAIN-INSPIRED LARGE LANGUAGE MODEL
  • 在Excel和WPS表格中通过查找替换对单元格批量强制换行
  • 【C++】map 容器的使用
  • 论文阅读:Gorilla: Large Language Model Connected with Massive APIs
  • Python基础:PyMySQL
  • 音视频开发学习路线梳理(附 GitHub 仓库)
  • 达梦数据库-控制文件 (二)
  • FPGA开发流程
  • 一键搭建开发环境:制作bash shell脚本
  • Apple Silicon Mac 上解决 Docker 平台不匹配和 QEMU 段错误问题
  • 腾讯云服务器重启卡住:原因分析与底层原理详解
  • AI-调查研究-62-机器人 机械臂五大应用场景详解:从焊接到手术,从农田到太空
  • Knife4j 文档展示异常的小坑
  • GBDT(Gradient Boosting Decision Tree,梯度提升决策树)总结梳理
  • 如何设置 Lustre 文件系统并在其上运行 PostgreSQL
  • 设计模式9-责任链模式
  • UDC否定响应码学习
  • 未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)
  • 《StarRocks、Doris、ClickHouse 深度对比:三大 OLAP 引擎的优劣与应用场景》
  • go的实现arp客户端
  • 《方法论》--笛卡尔
  • 【学习笔记】非异步安全函数(禁止在信号处理中调用)
  • 雷卯针对香橙派Orange Pi 4开发板防雷防静电方案
  • 【Golang】 项目启动方法
  • Android12 user版本默认开启adb调试