今天又被 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_LANG
、LC_ALL
禾蚕、LC_CTYPE
和LANG
這些環(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
中間嘗試了使用 gdb
在 fc-match.c
中調(diào)用 FcDefaultSubstitute
的部分加斷點,但是死活無法跳入函數(shù)體里面倍试,直接在函數(shù)里面響應(yīng)的行數(shù)處斷點讯屈,直接無效……撞鬼了
沒辦法了,只能改代碼了易猫,找了找代碼里面的 log 模塊叫 fcdbg.c
耻煤,我本來還說從 FcPattern
里面讀取屬性有點麻煩,又不熟悉代碼准颓,但是意外地找到一個 FcPatternPrint
哈蝇,這下連繼續(xù)研究下去的動力都沒有了,趕緊加代碼打印攘已,分別在 FcConfigSubstitute
和 FcDefaultSubstitute
前后加了打印看對 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è)置了 en
的 namelang
炮赦,那之后在 FcDefaultSubstitute
中 familylang
就從 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è)置給實際的文檔,工具欄中顯示的也就是這個名字于游』俅校總之,人家又不開源贰剥,瞎猜一下圖個開心咯倾剿。