[TextKit]为什么一些特殊字符会使汉字变细变小

[TextKit]Why some special characters could make Chinese characters thinner and smaller

这发生在 TextKit 上。但是用CoreText就一切正常了

Xcode的调试window中的富文本也有同样的问题

所以,这是TextKit的错误吗?除了用CoreText替换TextKit还有什么解决办法吗?

我试过了,CoreText和TextKit之间确实存在差异。 我猜想 是字体回退函数引起的。

比如我们有一个字符串“啦☜啦”,并设置了一个字体。如果给定的字体没有所有字符,通常会有一个后备字体列表,如:

English font
CJK font
Emoji font
Unicode font (support almost all the unicode character)

有两种方法可以找到后备字体。

  1. 从头开始查找
    • 在给定的字体中查找'啦'
    • 没找到,按顺序在后备字体中找到,在CJK字体中找到。
    • 在给定字体中查找“☜”。
    • 没找到,按顺序在后备字体中找到,在Unicode字体中找到。
    • 在给定的字体中查找'啦'
    • 没找到,按顺序在后备字体中找到,在CJK字体中找到。
  2. 从上一个中查找
    • 在给定的字体中查找'啦'
    • 没找到,按顺序在后备字体中找到,在CJK字体中找到。
    • CJK 字体中查找“☜”。
    • 没找到,按顺序在后备字体中找到,在Unicode字体中找到。
    • Unicode字体
    • 中查找'啦'
    • 找到。

所以如果TextKit使用第二种方式,两个'啦's may use different fonts because of the character '☜'。

为了解决这个问题,你可以使用属性字符串并给'☜'一个不同的字体大小来打破回退循环,然后第二个'啦'使用CJK字体。