SDL2_ttf无法呈现长度超过两个字节的字符吗?

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

本文关键字:两个 字节 字符 ttf SDL2      更新时间:2023-10-16

我正在程序中从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返回 Uint32。因此,较高的两个字节被丢弃(并且它们不会在代码中的其他任何地方读取),这就解释了为什么没有呈现" '(它不适合Uint16)。我将"c"的类型更改为Uint32,并且0x1F70D正确分配了它。它仍然没有渲染。很可能在其他地方不考虑长度超过两个字节的字符。

我的问题是,这是否只是我的误解或SDL2_ttf的已知问题,如果是,是否有任何已知的解决方法。

我最终使用了这个库,它似乎可以按应有的方式呈现所有内容。

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

我偶然发现了一个解决方法。例如,如果您使用书字体,则通常无法访问签证unicode char(1F4B3),但是他们将其映射到FFFF下方。我不确定确切的位置,但您可以使用 https://github.com/ryanoasis/nerd-fonts 的 ttfs 并在 2 个字节内获得良好的覆盖范围。