Windows下个别汉字字高对齐有问题:harfbuzz vs gdi

我使用的是Sarasa Term SC作为字体, 发现有个别字字高对齐不对,似乎在和英文对齐, 比如“中”:

0emacs

开始我以为是字体文件的问题, 打开font-forge看了一下, 发现字高没问题呀。 于是我查一下字的具体信息:

“中”

    harfbuzz:-outline-Symbola-normal-normal-normal-serif-24-*-*-*-p-*-iso8859-1 (#xF8A)

Character code properties: customize what to show
  name: CJK IDEOGRAPH-4E2D
  general-category: Lo (Letter, Other)
  decomposition: (20013) ('中')

而正常高度的汉字是:

“有”

    gdi:-outline-Weather Icons-normal-normal-normal-*-24-*-*-*-p-*-iso8859-1 (#x6709)

Character code properties: customize what to show
  name: CJK IDEOGRAPH-6709
  general-category: Lo (Letter, Other)
  decomposition: (26377) ('有')

而英文字母看上去与“中”类似的harfbuzz:

“g"

    harfbuzz:-outline-Sarasa Term SC-normal-normal-normal-mono-24-*-*-*-c-*-iso8859-1 (#x49)

Character code properties: customize what to show
  name: LATIN SMALL LETTER G
  general-category: Ll (Letter, Lowercase)
  decomposition: (103) ('g')

求助帮忙解决或解释一下为什么会有这种现象? 或者我该学习哪些理解这一现象呢? :sweat_smile:

感觉是字体优先级乱了,,可以看下这个blog,讲了怎么设置字体

谢谢!! 我去学习一下!

你每个字使用的字体都不一样,emacs -Q 下能复现这个问题吗?

谢谢, 我试了一下emacs -Q 然后界面手动设一下字体Sarasa Term SC 发现中英文都是正常的

harfbuzz:-outline-Sarasa Term SC-normal-normal-normal-mono-23-*-*-*-c-*-iso8859-1 (#x4B)

Character code properties: customize what to show
  name: LATIN SMALL LETTER I
  general-category: Ll (Letter, Lowercase)

接下来该怎么排查呢?

你是使用的Doom吗?我记得Emacs的字符集会相互覆盖的,之前还折腾过这方面的配置,因为 All-the-icon-fonts 的设置好像会默认覆盖掉中文里面的“中”和“言”两个字的显示,在字体设置里面加一句 prepend 也没用,因为doom-emacs的字体设置是在执行完用户的config之后才运行的。

我当时的一个比较“脏”的解决方法是在初始化字体后的hook里面来进行中文字符集的字体初始化配置。至今还能使用,不过貌似这个问题已经修复了?

这里说的都是DOOM的情况

你说的没错, 我是用了Doom, 能看一下你解决的代码吗?

我确实有日子没更新Doom了, 但是最近忙, 怕更新了出问题, 先打个补丁顺道学习一下 :rose:

(setq doom-font (font-spec :family "Sarasa Fixed Slab SC" :size 20 :weight 'semi-bold)
      doom-variable-pitch-font (font-spec :family "Sarasa Fixed Slab SC" :size 16 :weight 'semi-bold :slant 'italic))

(defun colawithsauce/set-fonts (&optional _rest)
  ;; (add-to-list 'face-font-rescale-alist '("Apple Color Emoji" . 0.9))
  ;; (add-to-list 'face-font-rescale-alist '("Sarasa Fixed Slab SC" . 0.88))
  (set-fontset-font t 'emoji "Apple Color Emoji")
  (set-fontset-font t 'symbol "Apple Color Emoji")
  (set-fontset-font t 'han "Sarasa Fixed Slab SC")
  (set-fontset-font t 'kana "Sarasa Fixed Slab J")
  (set-fontset-font t 'hangul "Sarasa Fixed Slab K")
  (set-fontset-font t 'cjk-misc "Sarasa Fixed Slab SC"))

;; Adding that function lets the setting of font works, but would slightly makes some extra expense. It worth?
(add-hook! '(after-setting-font-hook after-make-frame-functions) :append 'colawithsauce/set-fonts)

字体配置好久没有管了,有些都忘记为什么要加了。仅供参考。

1 个赞

我研究下, 灰常灰常感谢。