在我看来,一个常见的问题是:字符编码与位图字体相结合。大多数多语言编码在不同的字符类型之间有很大的空间,甚至还有很多未使用的代码点。因此,如果我想使用它们,我会浪费大量内存(不仅是为了保存多字节文本——我的意思是专门用于我的位图字体中的空格)——而且 VRAM 非常有价值......所以似乎唯一合理的事情是:在我的纹理上使用自定义映射,即 UTF-8 字符(这样就不会浪费空间)。但是:这项工作似乎与使用自己的专有字符编码相同(因此在我的纹理中也有自己的字符顺序)。在我的特殊情况下,我获得了 4096 个不同字符的纹理空间,并且需要字符来显示拉丁语言和日语(它与只支持通用 cjk 代码页的 utf-8 混为一谈)。有人遇到过类似的问题吗(我真的很想知道,如果没有的话)?如果已经有任何方法?
编辑:这里描述了同样的问题http://www.tonypottier.info/Unicode_And_Japanese_Kanji/但它没有提供如何将这些位图字体映射保存到 utf-8 空间效率的真正解决方案。因此,欢迎任何进一步的帮助!
编辑2:
非常感谢您的回答。对不起,我的问题描述得不够清楚。
我真正想解决的是:CJK Unicode 范围超过 20000 个字符。但是正确显示日语文本只需要大约 2000 个字符的子集。这些字符分布在从 U+4E00 到 U+9FA5 的范围内。所以我需要以某种方式将这些 Unicode 代码点(只有 2000 用于日语)转换为我创建的纹理的坐标(我也可以像我想要的那样对字符进行排序)。
即 U+4E03 是日文字符,但 U+4E04、U+4E05、U+4E06 不是。那么 U+4E07 也是一个日文字符。所以最简单的解决方案,我可以看到:在字符 U+4E03 之后在我的纹理中留下三个空格(或者在那里写上不必要的字符 U+4E04、U+4E05、U+4E06)然后写 U+4E07。但这会浪费太多纹理空间(20000 个字符,即使只需要 2000 个字符)。所以我希望能够只放入我的纹理:“...U+4E03,U+4E07...”。但是我不知道如何编写我的 displayText 函数——因为我不知道我想显示的字形的纹理坐标在哪里。会有一个哈希图或类似的东西,但我不知道如何存储这些数据(为每个字符编写类似 ...{U+4E03, 128}, {U+4E07, 129}...填充hasmap)。
对于问题: 1)没有特定的格式 - 所以我将自己编写 displayText 函数。2)没有理由反对 unicode - 它只是我的位图字体的 CJK 范围问题。3)我认为,这通常与平台和语言无关,但在我的情况下,我在 Mac OS X/iOS 上使用 C++ 和 OpenGL。
非常感谢您的帮助!如果您对此有任何进一步的想法,那真的对我有很大帮助!