本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

在 Arduino 中显示 Unicode

发布时间:2022-08-08
分享到:

在 Arduino 中显示 Unicode

发布时间:2022-08-08
分享到:

这个项目将向大家展示如何在Arduino中显示Unicode文本。

补给品

  • 任何带有 Arduino_GFX 支持显示器的 Arduino 开发板。

点击这里访问参考资料

第 1 步:Unicode 和 UTF-8
Unicode 定义了 144k+ 个字符,涵盖 159 个现代和历史脚本,以及符号、表情符号以及非视觉控制和格式化代码。
Unicode 可以通过不同的字符编码来实现。Unicode 标准定义了 Unicode 转换格式 (UTF):UTF-8、UTF-16 和 UTF-32,以及其他几种编码。
为了更好地向后兼容 Reason Arduino IDE,最新的操作系统和网页使用 UTF-8 编码。

UTF-8 旨在向后兼容 ASCII:Unicode 的前 128 个字符,与 ASCII 一对一对应,使用与 ASCII 具有相同二进制值的单个字节进行编码,因此有效的 ASCII 文本是有效的 UTF -8 编码的 Unicode 也是如此。

第 2 步:为什么需要 UTF-8?
有些项目只使用没有 Unicode 的 ASCII 字符就可以很好地呈现。

有些需要 Unicode 来支持多种语言,例如:

  • 显示您的移动通知的蓝牙设备
  • 提供最新消息的 RSS 阅读器显示
  • 国内天气预报面板
  • 社交网络评论仪表板
  • 电子书
  • 和更多文本显示项目

第 3 步:扩展 ASCII
Arduino_GFX 继承自 Adafruit_GFX,默认使用自 Adafruit_GFX 1.0 以来的经典固定空间位图字体。这种字体称为 glcdfont,大小为 5 x 7 像素,包含 128 个 ASCII 字符和 128 个扩展 ASCII 字符。您可以查看 AsciiTable 示例中的所有字符。

这是启用 UTF-8 编码之前的事项,Arduino_GFX 可以通过函数切换 UTF-8 编码:

gfx->setUTF8Print(true);

启用 UTF-8 编码后,不能使用扩展的 ASCII 字符。但是您可以改用相应的 UTF-8 编码字符。

例如,以扩展 ASCII 打印摄氏度符号是:

gfx->print("\xF8""C")

由于 Arduino IDE 可以直接使用 UTF-8 编码字符串,所以以 UTF-8 打印相同的符号是:

gfx->print("°C");

或者:

gfx->print("℃");

取决于所选 UTF-8 字体文件中包含的字符字形。

第 4 步:字体数据大小
如前所述,包含超过 144k 个字符的 unicode,将所有内容打包在 Arduino 程序中并不容易。

Unifont 是一种包含最常见定义的 UTF-8 字符的字体类型。在最新的 unifont_jp-14.0.02 版本中,它包含 57389 个字形,以及大小为 9.4 MB 的 BCF 格式字体文件。

普通的 AVR 系列开发板只有 32 KB 的 flash 存储程序;ESP8266 有 4 MB 闪存,但仍将程序限制在 1 MB 左右;RTL8720DN可存储2MB节目;ESP32超大APP模式可存储3MB程序;Raspberry Pi Pico 可以存储 2 MB 程序(某些变体可以存储高达 16 MB)。

第 5 步:U8g2 字体
Arduino_GFX 采用 U8g2 字体格式作为 UTF-8 解决方案。U8g2 字体支持 UTF-8 编码,U8g2 还提供了一些工具将字体文件转换为 Arduino 源文件。

bdfconv 是 U8g2 提供的工具之一,它可以将 unifont bdf 字体文件转换为 Arduino 源文件。输出二进制是压缩格式,bdfconv 可以选择编码范围输出,这两个特性都可以减少数据大小。

第 6 步:选择字体子集
由于我们不能简单地将一整套 Unifont 字形压缩到有限的程序空间中,我们需要选择一个将在特定项目中使用的字形子集。

U8g2 已经为各种语言准备了大量的 unifont 子集,例如:

  • u8g2_font_unifont_t_polish
  • u8g2_font_unifont_t_vietnamese1
  • u8g2_font_unifont_t_chinese2
  • u8g2_font_unifont_t_japanese1
  • u8g2_font_unifont_t_korean1

有些语言仍然无法适应 Arduino 中的所有字形,因此它具有不同大小的子集以满足不同的要求,例如中文字体有 3 个子集:

  • u8g2_font_unifont_t_chinese1 - 大小为 14,178 字节
  • u8g2_font_unifont_t_chinese2 - 大小为 20,225 字节
  • u8g2_font_unifont_t_chinese3 - 大小为 37,502 字节

您可以点击这里参考 U8g2 Github Wiki 了解更多详情

第 7 步:Arduino_GFX 准备好的字体文件
如前面步骤所述,某些 MCU 可以存储高达 1-3 MB 的程序大小。我们可以定制一个可以显示尽可能多的字形的字体文件。以下是在 Arduino_GFX 中准备的一些额外字体文件:

  • u8g2_font_unifont_h_utf8
  • u8g2_font_unifont_t_chinese
  • u8g2_font_unifont_t_chinese4
  • u8g2_font_unifont_t_cjk

源 BDF 字体位图使用unifont_jp-14.0.02,转换工具是 U8g2 提供的bdfconv

第 8 步:自定义字体:U8g2_font_unifont_h_utf8

This font included all glyphs in unifont_jp-14.0.02.
Number of Glyph: 57,389
Data size: 2,250,360 bytes
Converting script:
bdfconv -v -f 1 -b 1 -m "0-1114111" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_h_utf8.h -n u8g2_font_unifont_h

由于字体数据本身超过 2 MB,因此只有 ESP32 系列 Huge app 模式可以存储程序。某些特定版本的 Raspberry Pi Pico 具有超过 2 MB 的闪存,但我尚未对其进行测试。

第 9 步:自定义字体:U8g2_font_unifont_t_chinese
该字体包括所有汉字范围字形。

字形数量:22,145

数据大小:979,557 字节

转换脚本:

bdfconv -v -f 1 -m "32-127,11904-12351,19968-40959,63744-64255,65280-65376" unifont_jp-14.0.02.bdf -o u8g2_font_uni


第 10 步:自定义字体:U8g2_font_unifont_t_chinese4
由于 ESP8266 有 1 MB 的程序大小限制,所以仍然无法容纳所有汉字。它需要另一个子集缩小到仅常用字符。

常用字表来自常用国字标准字体表中字集和字表:中国常用字在GlyphWiki中。

字形数量:7,199

数据大小:298,564 字节

转换脚本:

bdfconv -v -f 1 -M common.txt unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_chinese4.h -n u8g2_font_unifont_t_chinese4

第 11 步:自定义字体:U8g2_font_unifont_t_cjk
此字体包含所有中文、日文和韩文字符。这 3 种语言共享 92,865 个 CJK 统一表意文字,因此可以使用一个字体文件显示 3 种不同的语言非常方便。

字形数量:41364

数据大小:1,704,862 字节

转换脚本:

bdfconv -v -f 1 -m "32-127,4352-4607,11904-12255,12288-19903,19968-40943,43360-43391,44032-55203,55216-55295,63744-64255,62072-65103,6 -65519" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_cjk.h -n u8g2_font_unifont_t_cjk

第 12 步:软件准备

Arduino IDE
如果您还没有这样做,请点击下载并安装 Arduino IDE:

Arduino_GFX 库
通过选择“工具”菜单->“管理器库...”打开 Arduino IDE 库管理器。搜索“用于各种显示器的 GFX”,然后按“安装”按钮。

您可以参考我以前的指导以了解有关 Arduino_GFX 的更多信息。

第 13 步:Unicode 示例

Arduino_GFX 在 U8g2Font 子文件夹中提供了各种 Unicode 示例。在 Arduino IDE 中,选择“文件”菜单 -> “示例” -> “GFX Library for Arduino” -> “U8g2Font”。5 个示例中有 4 个是 Unicode 示例:

  • U8g2FontPrintUTF8 - 使用 U8g2 内置字体以各种语言打印 Hello World
  • U8g2FontUTF8Chinese - 使用字体文件 u8g2_font_unifont_t_chinese 打印示例中文文章
  • U8g2FontUTF8FullCJK - 使用字体文件 u8g2_font_unifont_t_cjk 以中文、日文和韩文打印简单的问候信息
  • U8g2FontUTF8FullUnifont - 使用字体文件 u8g2_font_unifont_h_utf8 以 74 种语言打印 Hello World
  • U8g2RssReader - 使用字体文件 u8g2_font_unifont_t_chinese4 打印在线 RSS 提要消息

第 14 步:完成
现在您的 Arduino 项目刚刚突破了 ASCII 文本限制!开始享受成果吧!

* 以上内容翻译自网络,原作者:陳亮,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论