SDL2_ttf 不能渲染超过两个字节的字符吗?

Is SDL2_ttf incapable of rendering characters that are longer than two bytes?

我在我的程序中从 SFML 切换到 SDL2,并且我开始使用 SDL2_ttf 以 UTF-8 格式呈现文本。我使用函数 TTF_RenderUTF8_Solid。我注意到有些字符不再正确呈现。一个例子是 '' (U+1F70D)。我验证了该字体包含这些字符。

我尝试使用 SDL2_ttf 中包含的 glfont 示例程序,但它也不呈现这些字符。

我查看了 SDL2_ttf 源代码,查看了 SDL_ttf.c 中的函数 TTF_RenderUTF8_Solid,并注意到这一行:

    Uint16 c = UTF8_getch(&text, &textlen);

,而 UTF8_getch returns Uint32。因此较高的两个字节被丢弃(并且它们不会在代码的其他任何地方读取),这解释了为什么 '' 没有被渲染(它不适合 Uint16)。我将 'c' 的类型更改为 Uint32,并正确分配了 0x1F70D。它仍然没有呈现。很可能还有其他地方没有考虑超过两个字节的字符。

我的问题是这只是我的误解还是 SDL2_ttf 的一个已知问题,如果是,是否有任何已知的修复方法。

我最终使用了这个库,它似乎可以按预期呈现所有内容。

https://github.com/akrinke/Font-Stash

我偶然发现了一个解决这个问题的技巧。如果您使用 nerd 字体,例如 visa unicode char (1F4B3) 通常无法访问,但它们已将其映射到 FFFF 下方。我不确定具体在哪里,但是您可以使用 https://github.com/ryanoasis/nerd-fonts 中的 ttfs 并在 2 个字节内获得良好的覆盖率。