字符映射表(cmap)使用的是 LV_FONT_FMT_TXT_CMAP_SPARSE_TINY 类型,其核心原理是:

  • 通过 range_start(uint32_t)定位起始码点。
  • 通过 unicode_list(uint16_t 数组)存储相对于 range_start 的偏移量。
  • 因为偏移量是 16 位无符号整数,最大只能表示 65535。

如果字符码点为 0x1F600(😀),而 range_start 设为 0x0,则偏移量为 0x1F600 - 0x0 = 128512,远超 65535,无法存入 uint16_t,导致索引溢出或查找失败。

LVGL 字体格式中定义了另一种映射类型 LV_FONT_FMT_TXT_CMAP_SPARSE_FULL(相对于LV_FONT_FMT_TXT_CMAP_SPARSE_TINY),它与 TINY 的区别在于:

  • unicode_list 存储的是 完整的 32 位 Unicode 码点(绝对地址),而非 16 位偏移量。
  • 因此可以覆盖整个 Unicode 空间(0x0000 ~ 0x10FFFF)。