在使用 ESP8266 在屏幕显示中文字符的时候, 需要用到中文字符库. 根据网上的资料, 常用的库是 u8g2.

u8g2 库中包括了中文字库 wqy. 这个字库包括了不同大小的几个字符集, chinese1, chinese2, chinese3, gb2312a, gb2312b, gb2312. 前几个demo字符集小但是绝大部分文字都没有收录, 而直接使用后面的几个字符集又会报错:

.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\firmware.elf section `.rodata' will not fit in region `dram0_0_seg'
.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: address 0x40026778 of .pio\build\esp12e\firmware.elf section `.bss' is not within region `dram0_0_seg'
.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: address 0x40026778 of .pio\build\esp12e\firmware.elf section `.bss' is not within region `dram0_0_seg'

不难看出, 是内存不够用了. 为了解决这个问题, 网上可以查到的简单解决办法, 例如使用 --gc-sections 等参数都不管用.

此时只好尝试使用别人的魔改库, 参考了这篇文章后成功了, 可以使用最大的 u8g2_font_wqy16_t_gb2312. 具体方法是: 在 .pio/libdeps 里面先安装标准版本的 u8g2 和 wqy 库. 之后把魔改的文件直接覆盖已有文件. (否则, platformio 会自动重新下载标准版本.)

于是仔细检查了一下文件的区别, 发现主要不同的只有 u8g2 库更新了这些文件: (此处下载的是 u8g2 v1.8.0, wqy (commit: 34d1bf7))

进一步对比发现, 魔改版新增的内容如下:

$ diff modified/u8g2_fonts.h standard/u8g2_fonts.h
61,67d60
< #if defined(ESP8266)
< uint8_t u8x8_pgm_read_esp(const uint8_t * addr);   /* u8x8_8x8.c */
< #  define U8X8_FONT_SECTION(name) __attribute__((section(".text." name)))
< #  define u8x8_pgm_read(adr) u8x8_pgm_read_esp(adr)
< #  define U8X8_PROGMEM
< #endif
<
$ diff ~/u8g21.cpp ~/u8g22.cpp
40c40
< #include "u8g2_fonts.h"
---
>
44,51c44
< #if defined(ESP8266)
< uint8_t u8x8_pgm_read_esp(const uint8_t * addr)
< {
<     uint32_t bytes;
<     bytes = *(uint32_t*)((uint32_t)addr & ~3);
<     return ((uint8_t*)&bytes)[(uint32_t)addr & 3];
< }
< #endif
---
>

估计直接修改这两个文件也是可行的.