C++ 在SDL\U ttf中使用UTF8呈现字体

C++ 在SDL\U ttf中使用UTF8呈现字体,c++,unicode,utf-8,sdl,sdl-ttf,C++,Unicode,Utf 8,Sdl,Sdl Ttf,我正在尝试使用SDL\u TTF库提供的TTF\u RenderUTF8\u Blended方法渲染字符。我实现了用户输入(键盘),例如按“ä”或“ß”就可以了。这些是德语的特殊特征。在本例中,它们甚至出现在扩展的ASCII 8位代码中,但即使我复制并粘贴一些希腊字母(例如),使用UTF8也能正确呈现字体。(然而,并非所有的UNICODE字形都可以在这里找到(),我可以在测试中识别出来,但我想这是正常的,因为Arial字体可能没有每个字形。无论如何,大多数UNICODE字形都可以正常工作。) 我

我正在尝试使用SDL\u TTF库提供的
TTF\u RenderUTF8\u Blended
方法渲染字符。我实现了用户输入(键盘),例如按“ä”或“ß”就可以了。这些是德语的特殊特征。在本例中,它们甚至出现在扩展的ASCII 8位代码中,但即使我复制并粘贴一些希腊字母(例如),使用UTF8也能正确呈现字体。(然而,并非所有的UNICODE字形都可以在这里找到(),我可以在测试中识别出来,但我想这是正常的,因为Arial字体可能没有每个字形。无论如何,大多数UNICODE字形都可以正常工作。)

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

font_srf = TTF_RenderUTF8_Blended(font, "Hällö", font_clr);
我真的不明白为什么会这样。我在屏幕上看到的是:

H_ll_
我用uu来代表典型的垂直矩形,在下面的演讲中,作为一种有趣的介绍方式:

讽刺的是,当我使用TTF_RenderText_Blended(字体“Hällö”,字体“clr”)时;它之所以有效,是因为'ä'和'ö'是8位扩展ASCII编码的,但我想要的是UNICODE支持,所以这没有帮助

编辑和半解决方案

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

const char* c = input.c_str();

for (int i = 0; i < input.length(); i++)
{
    std::cout << int(c[i]) << " ";
}
-61,-74是‘ö’,而-61,-97是‘ß’。 这符合UTF8编码,对吗

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

    常量字符数组[]={0xC3,0xB6}

如果您中的一些人想知道,这段代码也可以正常工作。我想这就是我现在要做的。查找某些Unicode标志符号的十六进制代码并不难


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

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

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

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


当我的源文件中有一些Unicode标志符号时,IDE问我“为了维护数据,是否要将此文件重新保存为Unicode?”我说是的,所以我的源代码应该正确编码,还是我弄错了?请尝试使用\u。。。。而不是字符串中的字符常量。那你就知道你要通过什么了。如果这样做有效,请调查源文件编码-您可能没有传递您认为是的内容。使用调试器和断点检查正在传递的char*字节。使用十六进制编辑器(或者IDE,如果它允许以原始字节打开文件)检查源文件中的字节。您的编辑器可以保存6或8种不同的unicode。utf-7、utf-8、utf-16、ucs-2和其他,带或不带BOM(字节顺序标记)。你的编辑器保存了哪一个?我不知道我的编辑器保存了哪一个,我如何检查它?@huzzm debugger和/或hex editor,如前所述。你有C++11编译器吗?可能会尝试。我不确定,但我不这么认为,因为我的编译器不允许u8作为前缀。(但我怎么知道呢?)。作为IDE,我使用Microsoft Visual Studio 2012 Express。
const char char_array[] = {-61, -74, -61, -97, '\0'};
const char* char_pointer = char_array;