SDL 2.0 TextInputEvent UTF8数据存储

SDL 2.0 TextInputEvent UTF8 data storage

我想渲染文本。我的问题是我不知道如何使用 SDL SDL_TextInputEvent 的 char[32] 字段文本。根据文档,它是 "null-terminated input text in UTF-8 encoding"。据我了解,UTF8 需要 8 位,而 char 或多或少有 8 位。但是,如果 UTF8 只需要 1 个字节,为什么 SDL 会提供一个数组,大小为 32,所以 8 位或 1 个字节 * 32 = 32 个字节?

我需要计算出该值,以便将其解析为 FreeType 以获得字形索引。该 char[32] 字段的 "layout" 是什么?

UTF-8 之所以称为 UTF-8,是因为它将文本编码为 8 位单元的 序列。每个 Unicode 字符(代码点)将被编码为 1、2、3 或 4 个字节。同样,UTF-16 以 16 位为单位对字符(代码点)进行编码,每个字符将占用 16 位 32 位。有一些文本编码,其中每个字符恰好是 8 位,例如 ASCII1 或各种拉丁编码,但它们已经过时,您应该避免使用它们,除非您的文本已经用这些编码编码.

用户按下键盘上的一个键也可能产生多个字符,这也解释了为什么该字段这么大。

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

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

Wikipedia article on UTF-8 描述了如何解码它。请忽略 UTF-8 中不允许的 5 字节或 6 字节字符。

1:实际上是7位。