代码之家  ›  专栏  ›  技术社区  ›  Mithaldu

在同一个字形中有多个拉丁字符的字体吗?

  •  0
  • Mithaldu  · 技术社区  · 7 年前

    我有一个小项目,我试图本地化一个日本软件。遗憾的是,对于这个项目,我不能改变几个字符串的字节长度,它们被硬编码为使用UTF16,这意味着一个可以代表一个复杂单词的汉字只能用一个拉丁字母代替。(与UTF8相反,UTF8使用更少的字节。)

    但是软件使用的字体可以自由替换。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mike 'Pomax' Kamermans    7 年前

    如果您可以使用OpenType字体:请使用GSUB机制,这是通过字体进行本地化的最“自然”(就这一点而言)。通过将本地化映射中的每个字符序列定义为自己的替换规则,还可以避免从PUA映射中得到的重叠问题。

    首先,使用标准cmap子表格式4(实际上:与所有现代字体一样),用您想要使用的普通拉丁字符集定义字体,然后使用cmap子表格式14将整个CJK空间定义为“支持”,即“支持2E80和10FFF0之间的所有代码点,并映射到glyphid 1”。现在你的字体“支持”中日韩,但它实际上不能“绘制”中日韩文本。没关系:

    然后定义(很多)GSUB多对多连字规则的形式:

    ...
    消_す -> d_e_l_e_t_e
    ヘ_ル_プ -> h_e_l_p
    ...
    

    所以真正的魔法发生了:没有改变 任何东西 消す ,然后是“我支持该字符串中的所有字符”,然后是“我有一个代码点的精确组合的替换规则”,然后是“我已经为这个组合定型了” delete

    当然,这可能会导致本地化,因为你的英文标签太宽,你可能仍然需要PUA来解决这个问题,在这种情况下,你基本上是在illustrator/inkscape/任何具有良好文本支持的向量编辑器中写出你的单词,使用字体编辑器或类似的工具将整个本地化导入为单个glyph TTX ,然后使用多对一GSUB规则设置指向该单个glyph而不是新序列的GSUB规则:

    ...
    報告書 -> {glyph id for the "Generate report" glyph in PUA}
    ...
    

    我强烈建议加入 https://typedrawers.com

    推荐文章