WPS中的字體名

今天又被 fontconfig 坑到了……仔細(xì)想想业筏,半年到一年前我還對 fontconfig 狗屁不通呢亿驾,而現(xiàn)在我已經(jīng)被 fontconfit 坑了有幾次了,這印證了一個真理:“只要你足夠遲鈍迅脐,世界就是美好的愁溜,一旦你有了某種能力无午,麻煩就會找到你”——這只是個玩笑,事實上不管你有沒有能力祝谚,現(xiàn)實都不會讓你好過 ??

在這些坑里面,有兩個是跟今天主題相關(guān)的酣衷,也就是關(guān)于WPS中字體名稱的兩個問題:

  • WPS 字體列表中中文字體在中文環(huán)境下不顯示中文名(比如系統(tǒng)里面有宋體交惯,列表里面顯示 SimSun);
  • WPS 設(shè)置段落字體(中文字體)后,工具欄顯示的字體為英文名(比如你設(shè)置一段文字是宋體席爽,但是標(biāo)題欄顯示的仍然是SimSun

這兩個問題有點像意荤,但是卻不是同一個問題(也不只是WPS有問題,而是WPS對字體的需求比較多):

第一個問題原先是 論壇用戶報告 的(實際上劉老大也報過只锻,不過被自動忽略了??)玖像,論壇用戶又報過來以后,大家看用戶的報告太詳細(xì)了齐饮,感動得一塌糊涂捐寥,頓時解決問題的動力都有了。我也折騰了大半天祖驱,不過腦袋里面一直有一個同事的聲音:那是字體有問題握恳!我也挺贊同的:盜版的字體,不靠譜很正侈嗥В……所以乡洼,我就考慮能不能給字體做一些別名啥的,比如 SimSun 就叫 宋體……當(dāng)然了最后就是玩了一下 fontconfig 的配置以后匕坯,默默就放棄了束昵。

最后經(jīng)過 @felixonmars 同學(xué)的排查,發(fā)現(xiàn)是上游的一個 bug 葛峻,而且已經(jīng)修復(fù)锹雏,所以趕緊更了一波,解決了這個問題泞歉。

本以為皆大歡喜了逼侦,今天又有客戶報過來 bug,說 Windows 上寫好的文檔腰耙,調(diào)整好的字體榛丢,跑到deepin下字體就不對了,廢了老大的勁兒才又調(diào)好挺庞,其中就提到了選擇方正字庫里面的字體晰赞,顯示的不是中文字體名稱的問題。

怎么說呢选侨,幸虧我腦子不好掖鱼,不記得之前已經(jīng)解決過中文字體名顯示為英文的問題,要不然得跟客戶和老板掰扯一會兒援制,我只記得字體的中英文名字好像是有點問題戏挡,所以默默趕緊去看了一下,還真真的有問題晨仑。

因為 DDE 并沒有設(shè)置過多的 fontconfig 配置褐墅,所以我相信這不是 DDE 的問題拆檬,但是又覺得對于一個文字處理軟件來說,如果這么重要的功能都有 BUG妥凳,我真不信 WPS 的人還能坐得住竟贯,所以就想試一下在 Ubuntu 下 WPS 的這個行為是否正確。剛好年前 ElementryOS 發(fā)新版的時候嘗鮮裝了一個在測試機(jī)器上逝钥,所以很快切進(jìn)去下了一個 WPS 安裝上屑那,從一個正版的網(wǎng)站上下載了一個盜版的宋體,試了一下艘款,果然踏馬的是好的……

理性的我用事實證明了感性的我是錯誤的持际,氣氛一度很尷尬。

更讓人尷尬的是磷箕,我也不知道這是怎么回事选酗。但是,無巧不成書岳枷,就在這種尷尬氛圍的籠罩下芒填,我鬼使神差地在 ElementryOS (太長了,下面簡稱 EOS )上運行了 fc-match 宋體 這個命令空繁,而且很神奇的發(fā)現(xiàn)輸出的 simsun.ttf: "宋體" "Regular" 跟 deepin 下同樣命令輸出的 simsun.ttf: "SimSun" "Regular" 不太一樣殿衰,這可把我樂壞了——要知道一個稍微復(fù)雜點的圖形軟件,打開 fontconfig 的調(diào)試以后盛泡,輸出就是很可怕的闷祥,更別說 WPS!別問我是怎么知道的傲诵,回憶起來都是淚凯砍。但是現(xiàn)在使用 fc-match 就能重現(xiàn)的問題(我打心底認(rèn)為這倆是同一個問題),調(diào)試起來就比較簡單了拴竹。

fontconfig 本身為了方便程序調(diào)試悟衩,內(nèi)建了一些調(diào)試項,可以通過環(huán)境變量 FC_DEBUG 控制:

Name         Value    Meaning
  ---------------------------------------------------------
  MATCH            1    Brief information about font matching
  MATCHV           2    Extensive font matching information
  EDIT             4    Monitor match/test/edit execution
  FONTSET          8    Track loading of font information at startup
  CACHE           16    Watch cache files being written
  CACHEV          32    Extensive cache file writing information
  PARSE           64    (no longer in use)
  SCAN           128    Watch font files being scanned to build caches
  SCANV          256    Verbose font file scanning information
  MEMORY         512    Monitor fontconfig memory usage
  CONFIG        1024    Monitor which config files are loaded
  LANGSET       2048    Dump char sets used to construct lang values
  MATCH2        4096    Display font-matching transformation in patterns

我們只需要最簡略的匹配信息就可以了栓拜,所以:

$ FC_DEBUG=1 fc-match 宋體
FC_DEBUG=1
Match Pattern has 25 elts (size 32)
    family: "宋體"(s) "Noto Sans CJK SC"(s) "Noto Sans"(s)
    familylang: "en"(s) "en-us"(w)
    stylelang: "en"(s) "en-us"(w)
    fullnamelang: "en"(s) "en-us"(w)
    slant: 0(i)(s)
    weight: 80(i)(s)
    width: 100(i)(s)
    size: 12(f)(s)
    pixelsize: 12.5(f)(s)
    hintstyle: 1(i)(w)
    hinting: True(s)
    verticallayout: False(s)
    autohint: False(s)
    globaladvance: True(s)
    dpi: 75(f)(s)
    scale: 1(f)(s)
    lang: "zh-CN"(w)
    fontversion: 2147483647(i)(s)
    embeddedbitmap: True(s)
    decorative: False(s)
    lcdfilter: 1(i)(w)
    namelang: "en"(w)
    prgname: "fc-match"(s)
    symbol: False(s)
    variable: False(s)

Best score 0 0 0 0 0 0 0 0 0 0 1e+99 0 0 0 0 0 0 0 0 0 0 0 0 0 2.14735e+12
Pattern has 25 elts (size 25)
    family: "SimSun"(w) "宋體"(w)
    familylang: "en"(w) "zh-cn"(w)
    style: "Regular"(w)
    stylelang: "en"(w)
    fullname: "SimSun"(w) "宋體"(w)
    fullnamelang: "en"(w) "zh-cn"(w)
    slant: 0(i)(w)
    weight: 80(f)(w)
    width: 100(f)(w)
    spacing: 90(i)(w)
    foundry: "ZYEC"(w)
    file: "/home/hualet/.fonts/simsun.ttf"(w)
    index: 0(i)(w)
    outline: True(w)
    scalable: True(w)
    charset: 
    0000: 00000000 ffffffff ffffffff ffffffff 00000000 ffffffff ffffffff ffffffff
    0001: 08080002 00000800 000c2110 01000803 00040000 00000000 15554000 00000000
    0002: 00000000 00000000 00020000 00000002 00000000 00000000 12000ec0 00000000
    0003: 00000000 00000000 00000000 00000000 fffe0000 fffe03fb 000003fb 00000000
    0004: ffff0002 ffffffff 0002ffff 00000000 00000000 00000000 00000000 00000000
    0020: 77790000 0e2d0067 00000000 00000000 00000000 00001000 00000000 00000000
    0021: 00400228 00000006 00000000 03ff0fff 03cf0000 00000000 00000000 00000000
    0022: e4228100 20f04fa9 00041100 0000c0f3 02200000 80000020 00000000 00000000
    0023: 00040000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    0024: 00000000 00000000 00000000 fff003ff 0fffffff 00000000 00000000 00000000
    0025: ffffffff ffffffff ffff0fff 000fffff 0038fffe 300c0003 0000c8c0 0000003c
    0026: 00000260 00000000 00000005 00000000 00000000 00000000 00000000 00000000
    0030: 60ffffef 000003fe fffffffe ffffffff 780fffff fffffffe ffffffff 707fffff
    0031: ffffffe0 000003ff 00000000 00000000 00000000 00000000 00000000 00000000
    0032: 00000000 000203ff 00000000 00000000 00000000 00000008 00000000 00000000
    0033: 00000000 00000000 00000000 00000000 7000c000 00000002 00264010 00000000
    004e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    004f: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0050: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0051: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0052: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0053: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0054: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0055: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0056: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0057: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0058: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0059: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005a: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005b: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005c: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005d: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    005f: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0060: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0061: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0062: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0063: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0064: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0065: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0066: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0067: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0068: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0069: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006a: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006b: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006c: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006d: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    006f: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0070: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0071: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0072: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0073: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0074: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0075: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0076: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0077: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0078: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0079: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007a: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007b: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007c: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007d: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    007f: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0080: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0081: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0082: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0083: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0084: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0085: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0086: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0087: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0088: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0089: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008a: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008b: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008c: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008d: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    008f: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0090: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0091: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0092: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0093: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0094: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0095: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0096: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0097: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0098: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    0099: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009a: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009b: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009c: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009d: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009e: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
    009f: ffffffff ffffffff ffffffff ffffffff ffffffff 0000003f 00000000 00000000
    00e7: 00000000 00000000 00000000 00000000 00000000 00000000 00000180 000fff80
    00e8: ffe00000 ffffffff ffffffff 0000001f 00000000 00000000 00000000 00000000
    00f9: 00000000 00001000 00000000 02000000 00200000 00000000 00000000 00020080
    00fa: 811af000 0000039b 00000000 00000000 00000000 00000000 00000000 00000000
    00fe: 00000000 fffb0000 fef7fe1f 00000f7f 00000000 00000000 00000000 00000000
    00ff: fffffffe ffffffff 7fffffff 00000000 00000000 00000000 00000000 0000003f
(w)
    lang: aa|ay|bg|bi|br|ch|co|da|de|en|es|eu|fj|fo|fr|fur|fy|gd|gl|gv|ho|ia|id|ie|io|is|it|kum|lb|mg|nb|nds|nl|nn|no|nr|nso|oc|om|os|pt|rm|ru|sel|sma|smj|so|sq|ss|st|sv|sw|tl|tn|ts|uz|vo|wa|xh|yap|zh-cn|zh-sg|zu|an|fil|ht|jv|kj|kwm|li|ms|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(w)
    fontversion: 131072(i)(w)
    capability: "otlayout:hani"(w)
    fontformat: "TrueType"(w)
    decorative: False(w)
    postscriptname: "SimSun"(w)
    color: False(w)
    symbol: False(w)
    variable: False(w)

simsun.ttf: "SimSun" "Regular"

因為以前調(diào) fontconfig 的經(jīng)驗座泳,我模模糊糊知道那個 familylang 是控制 family 也就是字體名顯示的語言的,所以看到

familylang: "en"(s) "en-us"(w)

這行以后幕与,大致能確定應(yīng)該是系統(tǒng)某個配置出了問題讓 fontconfig 誤以為語言環(huán)境是英文挑势。看了一下環(huán)境變量啦鸣,沒發(fā)現(xiàn)哪個是設(shè)置英文的潮饱,所以只能去看代碼了。

下了 fontconfig 的源碼诫给,搜了一下關(guān)鍵字 familylang 香拉,猜測這個屬性應(yīng)該是通過操縱 FC_FAMILYLANG_OBJECT 饲漾,再次搜索:

 $ rg -i FC_FAMILYLANG_OBJECT
src/fcmatch.c
380:    case FC_FAMILYLANG_OBJECT:
551:    if (fe->object == FC_FAMILYLANG_OBJECT ||
565:        FC_ASSERT_STATIC ((FC_FAMILY_OBJECT + 1) == FC_FAMILYLANG_OBJECT);
695:        pe->object != FC_FAMILYLANG_OBJECT &&

src/fclist.c
430:        familyidx = FcGetDefaultObjectLangIndex (font, FC_FAMILYLANG_OBJECT, lang);

src/fcfreetype.c
1671:       while (FcPatternObjectGetString (pat, FC_FAMILYLANG_OBJECT, n, &familylang) == FcResultMatch)

src/fcdefault.c
316:    if (!FcPatternFindObjectIter (pattern, &iter, FC_FAMILYLANG_OBJECT))
318:    FcPatternObjectAdd (pattern, FC_FAMILYLANG_OBJECT, namelang, FcTrue);
319:    FcPatternObjectAddWithBinding (pattern, FC_FAMILYLANG_OBJECT, v2, FcValueBindingWeak, FcTrue);

發(fā)現(xiàn)其中只有 fcdefault.c 里面有執(zhí)行 FcPatternObjectAdd 這個操作像是在修改這個屬性,其他地方明顯都只是讀取缕溉,剛好 fc-match/fc-match.c 里面也有調(diào)用這個函數(shù),所以仔細(xì)看了一下這個函數(shù)吃型,從邏輯上看意思是 familylang 如果沒有設(shè)置证鸥,就會從 namelang 屬性繼承,然后我忽然發(fā)現(xiàn) fc-match 的幫助里面寫得位置參數(shù)概念上叫 pattern 勤晚,難道就對應(yīng) FcPattern枉层,那它應(yīng)該也可以指定 familylang 咯?網(wǎng)上搜尋了一番赐写,發(fā)現(xiàn)可以 fc-match 宋體:familylang=zh-cn鸟蜡,果然輸出正常的中文名。這算是一個小插曲吧挺邀。

接著 namelang 屬性說揉忘,這個屬性是從一個叫 FcGetDefaultLang 的函數(shù)處獲取,我心想總算是要到頭了端铛,然而發(fā)現(xiàn)從函數(shù)的實現(xiàn)來看泣矛,這個函數(shù)會從 FC_LANGLC_ALL禾蚕、LC_CTYPELANG這些環(huán)境變量里面挨個讀取默認(rèn)的語言(后來發(fā)現(xiàn)直接 man FcGetDefaultlangs 就可以看到)您朽,看起來沒毛病呀。

寫了個測試程序:

#include <stdlib.h>
#include <stdio.h>

#include <fontconfig/fontconfig.h>

int main(int argc, char const *argv[])
{
    FcStrSet *langs = NULL;

    langs = FcGetDefaultLangs();
    if (langs)
    {
        FcChar8 *lang = NULL;
        FcStrList *lang_list = NULL;

        lang_list = FcStrListCreate(langs);
        FcStrListFirst(lang_list);

        while(lang = FcStrListNext(lang_list)) {
            printf("%s", lang);
        }
    }

    return 0;
}

編譯執(zhí)行换淆,輸出 zh-CN 哗总,666

中間嘗試了使用 gdbfc-match.c中調(diào)用 FcDefaultSubstitute 的部分加斷點,但是死活無法跳入函數(shù)體里面倍试,直接在函數(shù)里面響應(yīng)的行數(shù)處斷點讯屈,直接無效……撞鬼了

沒辦法了,只能改代碼了易猫,找了找代碼里面的 log 模塊叫 fcdbg.c 耻煤,我本來還說從 FcPattern 里面讀取屬性有點麻煩,又不熟悉代碼准颓,但是意外地找到一個 FcPatternPrint 哈蝇,這下連繼續(xù)研究下去的動力都沒有了,趕緊加代碼打印攘已,分別在 FcConfigSubstituteFcDefaultSubstitute 前后加了打印看對 pat 的代碼:

    FcPatternPrint(pat);
    FcConfigSubstitute (0, pat, FcMatchPattern);
    FcPatternPrint(pat);
    FcDefaultSubstitute (pat);
    FcPatternPrint(pat);

輸出:

$ ./fc-match 宋體
Pattern has 1 elts (size 16)
    family: "宋體"(s)

Pattern has 6 elts (size 16)
    family: "宋體"(s) "Noto Sans CJK SC"(s) "Noto Sans"(s)
    hintstyle: 1(i)(w)
    lang: "zh-CN"(w)
    lcdfilter: 1(i)(w)
    namelang: "en"(w)
    prgname: "fc-match"(s)

Pattern has 25 elts (size 32)
    family: "宋體"(s) "Noto Sans CJK SC"(s) "Noto Sans"(s)
    familylang: "en"(s) "en-us"(w)
    stylelang: "en"(s) "en-us"(w)
    fullnamelang: "en"(s) "en-us"(w)
    slant: 0(i)(s)
    weight: 80(i)(s)
    width: 100(i)(s)
    size: 12(f)(s)
    pixelsize: 12.5(f)(s)
    hintstyle: 1(i)(w)
    hinting: True(s)
    verticallayout: False(s)
    autohint: False(s)
    globaladvance: True(s)
    dpi: 75(f)(s)
    scale: 1(f)(s)
    lang: "zh-CN"(w)
    fontversion: 2147483647(i)(s)
    embeddedbitmap: True(s)
    decorative: False(s)
    lcdfilter: 1(i)(w)
    namelang: "en"(w)
    prgname: "fc-match"(s)
    symbol: False(s)
    variable: False(s)

simsun.ttf: "SimSun" "Regular"

可以確認(rèn)是 FcConfigSubstitute 函數(shù)里面給 pat 設(shè)置了 ennamelang炮赦,那之后在 FcDefaultSubstitutefamilylang 就從 namelang 繼承了 en ,又加上了 en-us 样勃,變成了我們看到的 "en"吠勘,"en-us" 性芬。看函數(shù)名剧防, FcConfigSubstitute 應(yīng)該就是讀取了配置文件植锉,然后做了什么修改,至于怎么改的我也不知道峭拘。

這時候我偷懶癥犯了俊庇,沒有去看代碼了(看著略復(fù)雜),我發(fā)現(xiàn)新版 fontconfig 多了一個工具叫 fc-conflist 能列出來 fontconfig 加載的所有配置文件列表鸡挠,通過這個命令我發(fā)現(xiàn)系統(tǒng)里面的配置文件主要放在 /etc/fonts/usr/share/fontconfig 辉饱,然后就用 rg 去里面搜關(guān)鍵字 lang 了,排除其中 <test> 的行拣展,還真發(fā)現(xiàn)一個叫 /usr/share/conf.avail/15-assign-lang-en.conf 的文件里面有 edit namelang 這個屬性彭沼,在此之前,我都不知道還有 edit 這種操作……我也更不信這個問題會出在 fontconfig 的配置上备埃。

$ dpkg -S conf.avail/15-assign-lang-en.conf
deepin-default-settings: /usr/share/fontconfig/conf.avail/15-assign-lang-en.conf

事實證明姓惑,這個配置文件還真是 deepin 提供的……

本來想搞清楚之前為什么要做這個的,但是提交信息太簡單了瓜喇,沒有提供相關(guān)線索挺益,猜測應(yīng)該是以前有些字體名稱會亂碼——字體名稱需要特殊字體的支持,然而系統(tǒng)(終端)的字體不支持這種字體的字體名乘寒,為了解決亂碼望众,默認(rèn)使用英文輸出字體名稱 ??

不過有了 Noto 這種問題應(yīng)該就很少了,所以狠心刪掉了這個配置:提交伞辛。

結(jié)合這兩個問題烂翰,猜測 WPS 字體設(shè)置分兩個部分,一部分是從系統(tǒng)獲取字體列表蚤氏,這個部分是從 Qt 拿的甘耿,用的 Qt 提供的字體名(中文),第二部分是從這個字體名拿到系統(tǒng)中匹配度最高的字體竿滨,應(yīng)該是通過 libfontconfig 直接做得(deepin下英文)佳恬,然后再把這個字體設(shè)置給實際的文檔,工具欄中顯示的也就是這個名字于游』俅校總之,人家又不開源贰剥,瞎猜一下圖個開心咯倾剿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚌成,隨后出現(xiàn)的幾起案子前痘,更是在濱河造成了極大的恐慌凛捏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芹缔,死亡現(xiàn)場離奇詭異坯癣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)最欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門坡锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窒所,你說我怎么就攤上這事》妫” “怎么了吵取?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锯厢。 經(jīng)常有香客問我皮官,道長,這世上最難降的妖魔是什么实辑? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任捺氢,我火速辦了婚禮,結(jié)果婚禮上剪撬,老公的妹妹穿的比我還像新娘摄乒。我一直安慰自己,他們只是感情好残黑,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布馍佑。 她就那樣靜靜地躺著,像睡著了一般梨水。 火紅的嫁衣襯著肌膚如雪拭荤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天疫诽,我揣著相機(jī)與錄音舅世,去河邊找鬼。 笑死奇徒,一個胖子當(dāng)著我的面吹牛雏亚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逼龟,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼评凝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腺律?” 一聲冷哼從身側(cè)響起奕短,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宜肉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翎碑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谬返,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年日杈,在試婚紗的時候發(fā)現(xiàn)自己被綠了遣铝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡莉擒,死狀恐怖酿炸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涨冀,我是刑警寧澤填硕,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站鹿鳖,受9級特大地震影響扁眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅帜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一姻檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涝滴,春花似錦绣版、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腋妙,卻和暖如春默怨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骤素。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工匙睹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济竹。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓痕檬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親送浊。 傳聞我的和親對象是個殘疾皇子梦谜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容