在SDL_ttf中使用UTF8渲染字体

Rendering font with UTF8 in SDL_ttf

本文关键字:UTF8 字体 SDL ttf      更新时间:2023-10-16

我正在尝试使用SDL_ttf库提供的TTF_RenderUTF8_Blended方法来渲染字符。我实现了用户输入(键盘),例如按"ä"或"ß"效果很好。这些是德语的特殊字符。在这种情况下,它们甚至在扩展的ASCII 8位代码中,但即使当我复制和粘贴一些希腊字母时,字体也会使用UTF8正确呈现。(但并非所有您可以在此处找到的UNICODE字形(http://unicode-table.com/)我是否能够按照测试中识别的方式进行渲染,但我想这很正常,因为Arial字体可能没有每个字形。无论如何,大多数UNICODE字形都可以正常工作。)

我的问题是传递字符串(参数为const char*)和附加字符(到ASCII)时没有正确呈现。因此,在运行时用键盘输入"É"、"ß"或其他UNICODE字符是有效的,但将它们作为参数传递到代码中(比如说我的游戏标题)是不起作用的:

font_srf = TTF_RenderUTF8_Blended(font, "Hällö", font_clr);

我真的不明白为什么会发生这种事。我在屏幕上看到的是:

H_ll_
我用_来表示典型的垂直矩形,下面演讲的人用它作为一种有趣的介绍方式:https://www.youtube.com/watch?v=MW884pluTw8

具有讽刺意味的是,当我使用TTF_RenderText_Blended(字体,"Hällö",font_clr)时;它之所以有效,是因为"ä"answers"ö"是8位扩展ASCII编码,但我想要的是UNICODE支持,所以这没有帮助。

编辑&半解决方案

我有点(不是很好)解决了这个问题,因为我的输入很好,我只是检查了当我按"ä"、"ß"时我得到的输入值。。。在我的键盘上使用以下代码:

const char* c = input.c_str();
for (int i = 0; i < input.length(); i++)
{
std::cout << int(c[i]) << " ";
}

然后我用以下方式打印这些字符:

const char char_array[] = {-61, -74, -61, -97, ''};
const char* char_pointer = char_array;

-61,-74是"ö",-61,-97是"ß"。这确实适合UTF8编码,对吗?

  • U+00F6|ö|C3 B6(来自UTF8数据表)
  • 256-61=195为C3
  • 256-74=182为B6

    const char char_array[]={0xC3,0xB6};

这段代码也能很好地工作,以防您中的一些人感到疑惑。我想这就是我现在要继续做的事情。查找某些Unicode字形的十六进制代码并不难。

但我仍然不知道如何获得246的扩展ASCII整数值。另外,难道没有一个更人性化的解决方案来解决我的问题吗?

如果源文件中有非ASCII字符,那么该源代码文件的字符编码很重要。因此,在文本编辑器或IDE中,保存时需要设置字符集(例如UTF-8)。

或者,您可以使用\x。。。或\u。。。。格式来指定仅使用ASCII字符的非ASCII字符,所以源文件编码无关紧要。

Microsoft文档,但不是特定于MS的:

https://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx