提问人:huzzm 提问时间:6/2/2016 最后编辑:huzzm 更新时间:6/12/2016 访问量:4886
在 SDL_ttf 中使用 UTF8 呈现字体
Rendering font with UTF8 in SDL_ttf
问:
我正在尝试使用 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 整数值。另外,难道没有更人性化的解决方案来解决我的问题吗?
答:
如果源文件中有非 ASCII 字符,则该源代码文件的字符编码很重要。因此,在文本编辑器或 IDE 中,您需要在保存时设置字符集(例如 UTF-8)。
或者,您可以使用 \x...或者 \u....format 以仅使用 ASCII 字符指定非 ASCII 字符,因此源文件编码无关紧要。
Microsoft 文档,但不是特定于 MS:
https://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx
评论
u8
字符串文字。