您的页面上显示的是错误的日语
你为什么会看到这个页面?
如果有人给您提供了本页面的链接,他可能会认为您的代码显示日语有误。简而言之,在日语母语人士看来,您的ҭєxҭ lѳѳѳκs κιnd ѳf lικє ҭЋιs。本页将简要介绍在实现亚洲文字显示时经常出现的字形外观问题、出现问题的原因、问题的严重性以及解决方法。
好吧,出了什么问题?
汉字,又称汉语、汉文或简称汉字,是一套源于中国的字符,但在日本、韩国、台湾等地也有使用。这些国家使用的汉字集看起来大多相似,但也有大量字形不同的汉字。(字形是一个排版术语,指的是字符的外观而非含义)。
例如,下面是表示刀刃的刃字符的日文、简体中文和繁体中文字形变体:
语言 | 字符 | Unicode Code Point |
---|---|---|
日文 | U+5203 | |
简体中文 | U+5203 | |
繁体中文 | U+5203 |
因此,如果使用其他语言的汉字字形集显示日语文本,对于日语母语读者来说,由于文本中出现了不熟悉的字形,看起来就会显得不伦不类、隐隐约约、千奇百怪。您的页面很可能就是这种情况。
为什么会这样?
早在设计 Unicode 时,就有一项名为 “汉字统一”(Han Unification)的决定,即创建一个包含所有中文(简体/繁体)、日文和韩文汉字的统一字符集。这包括为不同语言中被认为等同的字符赋予等同的码位,从而使字符集的规模保持在较小的范围内。
不过,这也意味着不同语言中外观不同的字符,如刃、刃和刃,被赋予了相同的码位!您可以从前面的图表中看到,三个 “刀刃 “都被分配了 U+5203。这取决于显示文本的程序是否使用能显示正确字形集的字体来呈现它们。
在许多情况下,出现歧义时的默认回退行为是选择简体中文字形集。因此,如果开发人员没有意识到这一点,日文文本往往会错误地使用中文字形显示。
有那么严重吗?我是说,以前没有人向我报告过这个问题。
之所以没有人向您报告这个问题,很可能是因为受此影响最大的人不讲英语!
是的,由于页面在这种状态下并非完全不可读,因此我们很可能会认为这个问题不大,并未予与重视。然而,这个问题远不止是小写 A 有悬空 (a) 和没有悬空 (α)之间的区别。就像本文开头的例子一样,如果在英文文本中出现同样的症状,ιҭ wѳuld bє lѳѳκιng sѳmєҭЋιng lικє ҭЋιs。
就像前面的句子会让人立刻觉得怪异和错误一样,用不正确的字形集书写的日语文本也会让任何以日语为母语的人觉得怪异和错误,并且会让人觉得开发这款应用程序或页面的人并不关心全球用户中的这个(通常是很大的)子集。我希望您能同意,这种冷漠的态度并不是您想要传达的信息。
如何检查是否发生?
下面是一些已知在不同语言中具有不同字形的字符。
刃直海角骨入
试着将它们复制粘贴到您的代码中,查看渲染结果,并与下文进行比较。如果字形看起来与下面的日文结果示例不同(除了字体样式造成的差异),那么您的代码在显示日文时出现了错误。
我怎样纠正它?
一言以蔽之,解决的办法就是让你的代码和字体在显示日文时意识到这一点。
WEB开发:将元素标记为 lang=ja
在网络上,浏览器渲染引擎通常很聪明,可以从通用字体族声明(如 font-family: sans-serif
)中选择正确的字体。但是,如果您的 DOM
元素的 lang
或 xml:lang
属性没有指定为 ja
,那么它可能会选择错误的字体。请确保在将页面的输出语言切换为日语时,lang
属性也变更为 ja
。
此外,如果在 CSS 中明确指定字体,请务必指定专为该语言设计的字体。以下 font-family
声明涵盖了现代设备中预装的大多数标准日文字体(由 ICS Media 提供):
body { font-family: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif; }
游戏开发:从特定语言的字体中生成单独的字体图集
游戏通常使用从字体文件生成字体纹理图集的系统来存储和显示字体,例如 Unity 的 TextMesh Pro。
如果要使用这种系统,请确保为每种亚洲语言生成单独的字体图集,而且生成图集所用的源字体都是专门为该语言设计的。谷歌的 Noto 项目提供了专门为日语、简体中文、繁体中文、韩语等设计的优秀开放授权字体。
本文文字及图片出自 Your Code Displays Japanese Wrong