Unicode 日语的节省空间字符编码?

Unicode 日语的节省空间字符编码?,unicode,character-encoding,shift-jis,Unicode,Character Encoding,Shift Jis,在我看来,一个常见的问题是:字符编码与位图字体相结合。大多数多语言编码在不同的字符类型之间有巨大的空间,甚至还有许多未使用的代码点。因此,如果我想使用它们,我会浪费大量内存(不仅仅是为了保存多字节文本——我的意思是专门用于位图字体中的空格)——而且VRAM最有价值。。。因此,唯一合理的做法似乎是:在纹理上使用自定义映射,例如UTF-8字符(这样就不会浪费空间)。但是:这项工作似乎与使用自己的专有字符编码(也就是我的纹理中的字符顺序)是一样的。在我的特例中,我得到了4096个不同字符的纹理空间,需

在我看来,一个常见的问题是:字符编码与位图字体相结合。大多数多语言编码在不同的字符类型之间有巨大的空间,甚至还有许多未使用的代码点。因此,如果我想使用它们,我会浪费大量内存(不仅仅是为了保存多字节文本——我的意思是专门用于位图字体中的空格)——而且VRAM最有价值。。。因此,唯一合理的做法似乎是:在纹理上使用自定义映射,例如UTF-8字符(这样就不会浪费空间)。但是:这项工作似乎与使用自己的专有字符编码(也就是我的纹理中的字符顺序)是一样的。在我的特例中,我得到了4096个不同字符的纹理空间,需要字符来显示拉丁语和日语(utf-8只支持通用的cjk代码页,这太糟糕了)。有没有人遇到过类似的问题(我真的很想知道,如果没有的话)?如果已经有办法了

编辑:这里描述了相同的问题,但它没有提供一个真正的解决方案,如何将这些位图字体映射保存到utf-8空间效率。因此,欢迎任何进一步的帮助

编辑2:

非常感谢你的回答。对不起,我的问题描述得不够清楚

我真正想解决的是:CJK Unicode范围超过20000个字符。但只有大约2000个字符的子集才能正确显示日文文本。这些特征分布在从U+4E00到U+9FA5的范围内。因此,我需要以某种方式将这些Unicode代码点(日语只有2000)转换为我创建的纹理的坐标(在这里,我可以按照我想要的顺序排列字符)

i、 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函数,因为我不知道我想显示的字形的纹理坐标在哪里。可能需要一个hashmap或类似的东西,但我不知道如何存储这些数据(为每个字符编写类似于……{U+4E03,128},{U+4E07,129}……的东西来填充hashmap会很混乱)

对这些问题: 1) 没有特定的格式-因此我将自己编写displayText函数。 2) 没有理由反对unicode-这是我的bitmapfont唯一的CJK范围问题。 3)我认为,这通常是PrtStRead和语言无关的,但在我的例子中,我在Mac OS X/iOS上使用C++和OpenGL。
非常感谢你的帮助!如果你有任何进一步的想法,这将真的帮助我很多

仅中文就有4096个字符,我说的不是标点符号,而是用来构成单词的字符。发件人:

《康熙字典》中包含的汉字数量约为47035个,尽管其中大量是历史上积累的很少使用的变体

即使其中许多很少使用,即使90%不需要,你仍然会耗尽你的配额。(我认为现代文本中实际使用的数字大约在10-20k左右。)


如果您事先知道需要使用哪些字符,那么最好的选择可能是创建一个Unicode代码点的间接表来索引到您的纹理中。然后,您只需在纹理中添加实际使用的字符数即可。我相信Flash(和一些PDF)在内部会做类似的事情。

UTF-8通常是一种非常有效的编码。如果您的应用程序主要关注亚洲和其他具有多字节字符集的地区,那么使用UTF-16可能会使您受益更多。您当然可以编写自己的编码,但它不会保存那么多数据,而且会为您提供大量工作


如果您真的需要压缩数据(我想知道是否以及为什么),您最好使用一些算法来压缩UTF数据。大多数算法在处理较大的数据块时效率更高,但也有用于压缩小块文本的算法。我认为,如果您探索这些,而不是定义自己的编码,您将节省大量时间。

您可以使用多个位图并按需加载它们,而不是一个试图包含所有可能字符的位图。

您想要解决的真正问题是什么

UTF-8编码的字符串是否每个字符占用三个字节?如果是,则切换到UTF-16。否则不要责怪UTF-8。(说明:UTF-8只是一种将整数序列转换为字节序列的算法。它与代码页中的字符分组无关。而这正是Unicode代码点的作用。)

Unicode代码点是否分布在多个“代码页”(其中“代码页”表示由256个相邻Unicode代码点组成的块)上?如果是,则创建从Unicode代码点(0x000000-0x10FFFF)到较小整数集的映射。就内存而言,这应该不超过您真正需要的字符数的4字节倍。查找时间大约为24次内存访问、24次整数比较和24条分支指令。(事实上,这将是树映射中的二进制搜索。)如果这太昂贵,您可以使用基于哈希表的映射

是别的吗?那么请给我们举一些例子,以便更好地理解您的问题

据我所知,您可能应该编写一个小型实用程序,将希望在应用程序中使用的一组Unicode代码点作为输入,然后生成用于显示文本的代码和数据。这就提出了以下问题:<
Rectangle position(int codepoint)
void displayText(int x, int y, String s) {
  for (char c : s.toCharArray()) { // TODO: handle code points correctly
    int codepoint = c;
    Rectangle position = positions.get(codepoint);
    if (position != null) {
      // draw bitmap
      x += position.width;
    }
  }
}

Map<Integer, Rectangle> positions = loadPositionsFromFile();