在 SDL_ttf 中使用 UTF8 呈现字体

Rendering font with UTF8 in SDL_ttf

提问人:huzzm 提问时间:6/2/2016 最后编辑:huzzm 更新时间:6/12/2016 访问量:4886

问:

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

我的问题是将字符串(参数作为)传递附加字符(ASCII)无法正确呈现。因此,在运行时使用键盘输入“Ä”、“ß”或其他一些 UNICODE 字符是有效的,但是将它们作为参数传递以在代码中获取 - 比方说我的游戏的标题 - 不起作用:const char*

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

    常量字符 char_array[] = {0xC3, 0xB6};

如果你们中的一些人想知道,这段代码也可以正常工作。我认为这是我现在将继续做的事情。查找某些 Unicode 字形的十六进制代码并不难。

但是我仍然无法弄清楚如何获得 246 的扩展 ASCII 整数值。另外,难道没有更人性化的解决方案来解决我的问题吗?

C++ Unicode UTF-8 SDL-TTF

评论

1赞 genpfault 6/2/2016
你有 C++11 编译器吗?可能会尝试 u8 字符串文字
0赞 huzzm 6/4/2016
我不确定,但我不这么认为,因为我的编译器不允许 u8 作为前缀。(不过我怎么弄清楚呢?作为IDE,我使用Microsoft Visual Studio 2012 Express。

答:

2赞 Peter Stock 6/2/2016 #1

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

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

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

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

评论

0赞 huzzm 6/2/2016
当我的源文件中有一些Unicode字形时,IDE问我“是否要将此文件重新保存为Unicode以维护数据?”,我说是的,所以我的源代码应该正确编码,还是我弄错了?
0赞 Peter Stock 6/2/2016
尝试使用 \u...。字符串中的 char 常量。然后你就知道你正在传递什么。如果可行,请调查源文件编码 - 您可能没有传递您认为的内容。使用调试器和断点检查要传递的 char * 的字节数。使用十六进制编辑器(或者 IDE,如果它允许将文件作为原始字节打开)来检查源文件中的字节。
0赞 gman 6/2/2016
您的编辑器可以保存 6 或 8 种不同类型的 unicode。utf-7、utf-8、utf-16、ucs-2 等,带或不带 BOM(字节顺序标记)。你的编辑保存了哪一个?
0赞 huzzm 6/4/2016
我不知道我的编辑器保存了哪一个,我该如何检查?
0赞 Peter Stock 6/4/2016
@huzzm调试器和/或十六进制编辑器,如前面的评论。