Fonts 同一字形中是否有多个拉丁字符的字体?

Fonts 同一字形中是否有多个拉丁字符的字体?,fonts,glyph,Fonts,Glyph,我正在做一个小项目,我正在尝试本地化一个日本软件。遗憾的是,对于这个项目,我无法更改几个字符串的字节长度,它们被硬编码为使用UTF16,这意味着可以表示复杂单词的单个汉字只能替换为单个拉丁字母。(与UTF8相反,UTF8中拉丁字母占用的字节更少。) 但是,软件使用的字体可以自由更换 一种解决方案是使用一种字体,其字形包含多个拉丁字符 类似的东西已经存在了吗?如果可以使用OpenType字体:使用GSUB机制,这是通过字体进行本地化的最“自然”的方式。通过将本地化映射中的每个字符序列定义为自己的替

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

但是,软件使用的字体可以自由更换

一种解决方案是使用一种字体,其字形包含多个拉丁字符


类似的东西已经存在了吗?

如果可以使用OpenType字体:使用GSUB机制,这是通过字体进行本地化的最“自然”的方式。通过将本地化映射中的每个字符序列定义为自己的替换规则,还可以避免PUA映射中出现的重叠问题

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

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

...
消_す -> d_e_l_e_t_e
ヘ_ル_プ -> h_e_l_p
...
因此,真正的神奇发生了:在实际应用程序中,除了更改字体之外,不需要更改任何内容,您现在就可以获得正确的英语(或您需要的任何语言)对应字符串,这完全是因为字体做了它应该做的事情:它看到它需要塑造字符串
消す,然后是“我支持该字符串中的所有字符”,然后是“我有一个用于此代码点精确组合的替换规则”,然后是“我已形成了
删除
的组合,在这里。”

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

...
報告書 -> {glyph id for the "Generate report" glyph in PUA}
...
应该是这样的:利用OpenType实现本地化,而不涉及“真实”代码(当然,除了您编写的自动字体生成过程的代码!)


我强烈建议大家加入进来,向人们寻求实际的实现和工具帮助——在像Font Creator这样的应用程序中,这几乎是微不足道的,在Font Forge这样的应用程序中,这当然不是很多工作,但typedrawers是所有排版工程师经常去的地方,如果你能使用OpenType字体,你会得到比Stackoverflow更详细的帮助。

如果你能使用OpenType字体:使用GSUB机制,这是通过字体进行本地化的最“自然”的方式。通过将本地化映射中的每个字符序列定义为自己的替换规则,还可以避免PUA映射中出现的重叠问题

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

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

...
消_す -> d_e_l_e_t_e
ヘ_ル_プ -> h_e_l_p
...
因此,真正的神奇发生了:在实际应用程序中,除了更改字体之外,不需要更改任何内容,您现在就可以获得正确的英语(或您需要的任何语言)对应字符串,这完全是因为字体做了它应该做的事情:它看到它需要塑造字符串
消す,然后是“我支持该字符串中的所有字符”,然后是“我有一个用于此代码点精确组合的替换规则”,然后是“我已形成了
删除
的组合,在这里。”

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

...
報告書 -> {glyph id for the "Generate report" glyph in PUA}
...
应该是这样的:利用OpenType实现本地化,而不涉及“真实”代码(当然,除了您编写的自动字体生成过程的代码!)


我强烈建议大家加入进来,向人们寻求实际的实现和工具帮助——在像Font Creator这样的应用程序中,这几乎是微不足道的,在Font Forge这样的应用程序中,这当然不是很多工作,但typedrawers是所有排版工程师经常去的地方,与Stackoverflow相比,您更有可能获得详细的帮助。

我不明白您所说的“一个汉字[…]只能替换为一个拉丁字母。与UTF8相反,UTF8中拉丁字母占用的字节更少。”这完全是无关的。你想干什么?为什么本地化与字体中的内容有着千丝万缕的联系?您正在翻译字符串,而不是通过将文本作为图片放在字体中来伪造文本。@Mike'Pomax'Kamermans这是一个遗留软件,并且正在本地化这个特殊字符