在SDL_ttf

时间:2016-06-01 20:05:21

标签: c++ unicode utf-8 sdl sdl-ttf

我正在尝试使用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)时;它的工作原理是因为'ä'和'ö'是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, '\0'};
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整数值。另外,对我的问题是否有一个更人性化的解决方案?

1 个答案:

答案 0 :(得分:1)

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

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

Microsoft doc,但不是MS特定的:

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