首页 > 解决方案 > 为什么chrome渲染不同的unicode字符””(U+2F804)”和你”(U+4F60)是同一个字符

问题描述

在Windows 7系统中,Chrome使用“微软雅黑”字体将字符U+2F804()显示为U+4F60(你)

但是这个字体中没有U+2F804对应的字符。

使用 fontCreator 找到的结果如下所示

点击显示图片

在 windows 10 系统中,因为有 Yu Gothic 字体,所以结果是正确的。

点击显示图片

点击显示图片

令我困惑的是为什么 Windows 7 会显示为 U+4F60(你)

代码地址为:<a href="http://yanglikun.github.io/encoding/code.html" rel="nofollow noreferrer">http://yanglikun.github.io/encoding/code.html

我认为微软雅黑字体中没有对应字符时应该显示问号、口、或其他字符,而不是错误字符U+4F60(你)

标签: google-chromecharacter-encodingfont-family

解决方案


注意:unicode 代码点和字体字形没有直接关系。实际字形取决于上下文、连字、组合字符、语言和可能的其他因素(请参阅 Unicode 标准)。

Unicode 定义 U+2F804 可分解为 U+4F60。Unicode 文本通常由软件规范化。通过分解它们(经常拆分字符和重音,例如对于拉丁语言),或者通过组合它们。此类算法以 Unicode 进行描述。所以在这种情况下,它被认为是 U+4F60 在语义上完全等于 U+2F804(和首选形式)。包含相同数量代码点的分解并不常见(但也不是看不见)。而且在一个方向上也很少有分解,而在另一个方向上没有关系。

这个字符在CJK Compatibility Ideographs Supplement中,所以重要的部分是兼容性,这也被 wikipedia 文章 ( https://en.wikipedia.org/wiki/CJK_Compatibility_Ideographs_Supplement ) 证实。

通过提供其他编码的无损往返转换,引入了兼容性代码点以简化 Unicode 的引入。[以这种方式,可以在不同的层上实现 Unicode,没有问题并且完全透明,并且不需要更改其他层(或更糟糕的是:一步更改所有堆栈)。


推荐阅读