Emacs中的“中”字和“言”字显示奇怪

我是自己配置的emacs,然后font set里字体用的Hei(mac字体),除了个别中文字,都是我用的字体,比如“中”这个字就不是,我也一直很头痛。。看describe-char几个字的charset、category什么都一样,但他就是不用那些字体

             position: 1 of 6 (0%), column: 0
            character: 中 (displayed as 中) (codepoint 20013, #o47055, #x4e2d)
              charset: chinese-gbk (GBK Chinese simplified.)
code point in charset: 0xD6D0
               script: han
               syntax: w 	which means: word
             category: .:Base, C:2-byte han, L:Left-to-right (strong), c:Chinese, h:Korean, j:Japanese, |:line breakable
             to input: type "C-x 8 RET 4e2d"
          buffer code: #xE4 #xB8 #xAD
            file code: #xE4 #xB8 #xAD (encoded by coding system utf-8-unix)
              display: by this font (glyph code)
    mac-ct:-*-Symbola-normal-normal-semicondensed-*-11-*-*-*-p-0-iso10646-1 (#x153D)

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

There is an overlay here:
 From 1 to 7
  face                 hl-line
  priority             -50
  window               #<window 3 on test>

[back]
             position: 2 of 6 (17%), column: 2
            character: 我 (displayed as 我) (codepoint 25105, #o61021, #x6211)
              charset: chinese-gbk (GBK Chinese simplified.)
code point in charset: 0xCED2
               script: han
               syntax: w 	which means: word
             category: .:Base, C:2-byte han, L:Left-to-right (strong), c:Chinese, h:Korean, j:Japanese, |:line breakable
             to input: type "C-x 8 RET 6211"
          buffer code: #xE6 #x88 #x91
            file code: #xE6 #x88 #x91 (encoded by coding system utf-8-unix)
              display: by this font (glyph code)
    mac-ct:-*-Hei-normal-normal-normal-*-13-*-*-*-p-0-iso10646-1 (#xEE8)

Character code properties: customize what to show
  name: CJK IDEOGRAPH-6211
  general-category: Lo (Letter, Other)
  decomposition: (25105) ('我')

There is an overlay here:
 From 1 to 7
  face                 hl-line
  priority             -50
  window               #<window 3 on test>

[back]

rg 一下配置看看,提到 symbola 的是哪儿?

(progn
  (set-face-attribute 'default nil :family "Hack" :height (* 10 vonfry-fontsize))
  (set-fontset-font nil 'unicode (font-spec :name "Symbola" :height (* 10 vonfry-fontsize)) nil 'append)
  (dolist (charset '(greek symbol))
    (set-fontset-font nil charset (font-spec :name "Symbola" :height (* 10 vonfry-fontsize)) nil 'prepend))
  (dolist (font '("Hei" "Source Han Sans CN"))
    (dolist (charset '(kana han symbol cjk-misc bopomofo))
      (set-fontset-font (frame-parameter nil 'font)
                        charset
                        (font-spec :family font :size (+ 2 vonfry-fontsize))
                        nil 'append))))

我配置是自己写的,全部的字体设置都在这里了。。symbola有影响的只有greek和symbol

不会是unicode里面的吧。。但是这个字describe里是chinese-gbk的。。 我去把unicode也加到中文字体的,或者删掉symbola的相关定义也是一样的。。 刚刚拿emacs -Q试了一下,居然没问题了。然后发现,我刚刚调了一下是改在其它文件里了,没有改到emacs读取的config里(因为用了home-manager

1 个赞

我也遇到了这样的问题,用sandbox查看没问题,最后发现在init.el里取消掉unicode的注释就可以正常显示了

取消了unicode之后,发现字体设置改变了,原来的设置不起作用了。

检查一下 doom-unicode-extra-fonts 的值,是否包含字体 “file-icons” ,如果包含的话,删掉试试。 或者直接删掉 “file-icons” 字体。

要设置scrip: han 里面的han,而不是unicode。

弱弱问一句 awesome-tab的字体是什么

好像是更纱黑体?当时的设置现在已经改了 :crazy_face:

1 个赞

rg file-icons发现是在core/core-ui.el定义了doom-extra-unicode-font,documentation 是

Fonts to inject into the Unicode charset before doom-unicode-font.

然后我就在config.el里面加入了(push "Sarasa Mono SC Nerd" doom-unicode-extra-fonts) 把我自己用的字体放在了doom-unicode-extra-fonts的最前面,然后言字就显示正常了并且还是原来的字体

2 个赞

谢谢了,感觉字体设置好乱,设置方法又多种多样,混沌了。

(defvar +prefer-fonts '("Fira Code" "SF Mono" "Source Code Pro" "Noto Mono" "Hack"
                        "Menlo" "Monaco" "DejaVu Sans Mono" "Consolas"))
(if IS-WINDOWS
    (add-to-list '+prefer-fonts "Sarasa Mono SC"))
(cl-loop for font in +prefer-fonts
         when (+font-installed-p font)
         return (setq doom-font (font-spec :family font)))

(if IS-WINDOWS
    ;; doom/core-ui.el set this(for all-the-icons), cause font display problem for cjk
    (setq doom-unicode-extra-fonts nil))

我的配置

抱歉挖坟来回答这个问题,做个记录吧。在https://github.com/hlissner/doom-emacs/issues/3250 中,其实就已经有方法了,我自己选用的字体是Noto Sans CJK SC。希望遇到同样问题的人看到这个设置方法。

1 个赞

挖坟没什么啊,感谢提供更多解决方案 :heart:

另外:最近更新之后这个变量被废弃,因此这个方法不能用了

我特别好奇这个「言」是有个字体里的「言」真长这样,还是 harfbuzz 里面有套机制自动用 ASCII 符号组合汉字⋯⋯

doom emacs 可以参考添加这段代码

(let ((font-chinese "PingFang SC"))
  (add-hook! emacs-startup :append
   (set-fontset-font t 'cjk-misc font-chinese nil 'prepend)
   (set-fontset-font t 'han font-chinese nil 'prepend)
   ;; (set-fontset-font t ?中 font-chinese nil 'prepend)
   ;; (set-fontset-font t ?言 font-chinese nil 'prepend)
   ))
6 个赞

挺管用的, 感谢

23年前来挖坟,因为很不幸的是没有用前面的方案解决,以下是我的设置:

(setq doom-font (font-spec :family "Fira Code" :size 18 :weight 'semi-light)
     doom-variable-pitch-font (font-spec :family "Fira Code" :size 18)
     doom-unicode-font (font-spec :family  "思源黑体 CN"))

通过M-x: describe-font命令,搜索框输入 cn 查看自己有什么中文字体,我有 “思源黑体 CN”

在config.el文件内修改字体的地方(上方代码) 中加入doom-unicode-font (font-spec :family “思源黑体 CN”) 言字就不会显示错误了。

5 个赞

这个方法有用,谢谢。