C++ SDL 2.0文本输入事件UTF8数据存储

C++ SDL 2.0文本输入事件UTF8数据存储,c++,unicode,utf-8,sdl,sdl-2,C++,Unicode,Utf 8,Sdl,Sdl 2,我想渲染文本。我的问题是我不知道如何使用SDL的SDL_TextInputEvent的char[32]字段文本。根据文档,这是一个“UTF-8编码的空终止输入文本”。据我所知,UTF8需要8位,而一个字符有或多或少的8位。但是为什么SDL给我提供了一个数组,大小为32,所以8位或1字节*32=32字节,如果UTF8只需要1字节 我需要计算出该值,以便将其解析为FreeType以获取glyph的索引。该字符[32]字段的“布局”是什么?UTF-8被称为UTF-8,因为它将文本编码为8位单元序列。每

我想渲染文本。我的问题是我不知道如何使用SDL的SDL_TextInputEvent的char[32]字段文本。根据文档,这是一个“UTF-8编码的空终止输入文本”。据我所知,UTF8需要8位,而一个字符有或多或少的8位。但是为什么SDL给我提供了一个数组,大小为32,所以8位或1字节*32=32字节,如果UTF8只需要1字节


我需要计算出该值,以便将其解析为FreeType以获取glyph的索引。该字符[32]字段的“布局”是什么?

UTF-8被称为UTF-8,因为它将文本编码为8位单元序列。每个Unicode字符(代码点)将被编码为1、2、3或4字节。同样,UTF-16以16位单位编码字符(代码点),每个字符将采用16位或32位。有些文本编码中每个字符正好是8位,例如ASCI1或各种拉丁语编码,但它们已经过时,除非已经在这些编码中编码了文本,否则应该避免使用它们

用户按下键盘上的一个键也可能产生多个字符,这解释了字段如此大的原因

为了使用FreeType正确呈现UTF-8文本,请将UTF-8文本加载到缓冲区,缓冲区将运行整形算法,并为您提供字形索引和字形位置的列表

如果你不想使用HarfBuzz(也许你只关心英语),那么你可以自己做。您必须将UTF-8文本作为一系列Unicode代码点读取,并使用FreeType将这些代码点传递到字体中的Unicode字符映射,然后绘制生成的字形。这通常会给你不正确的结果,结果可能看起来不太好,但对于英文文本来说,它通常已经足够好了

描述了如何对其进行解码。请忽略提及UTF-8中不允许的5字节或6字节字符


1:实际上是7位。

非常感谢。你的解释有道理。哈夫布兹似乎正是我需要的。HarfBuzz的文档不是很好,但是有一些示例程序。