[已解决]Tumbleweed 下新的 noto-sans-cjk 字体包的问题

你的其它程序都没有问题吗?例如 YaST。另外你是用 Tumbleweed 还是 Leap?

bug: bugzilla.opensuse.org/show_bug.cgi?id=972664

fix: build.opensuse.org/request/show/379647

1赞

谢谢苏姐。另外还有一个问题,安装字体包会改动默认的字体匹配顺序吗?如果是,改了哪里的配置文件?

PS: 我论坛主题的订阅失效了吗?没有接到邮件通知。

部分生效是因为大部分网页对中文文字部分并没有显式的指定 lang 属性,或者指定了字体 fallback 顺序而那个字体正好被 Chrome 查找到了。想强力指定网页中文字体,还需要在 Tampermonkey 中添加 User Script ,详见我的帖子。( [用 fontconfig 和 TamperMonkey 解决 Chrome 中文粗体(以及常规字体)问题) )

当然是 Tumbleweed 。

YaST 没问题(系统是英文,特意装了个语言包试了一下……),FireFox 显示的网页也没问题,只有 Chrome 有问题。

另外我现在是用 fonts-config 指定了字体的 family-prefer ,否则系统显示字体中文都会变成某种宋体(见截图),然而 fc-match 的结果都是 Noto Sans CJK SC ……好诡异

noto-sans-cjk 更新之后完全没有变化……



……
问题都已经解决了,也证明了问题是存在的。

你是手动指定了 *SC 的字体,而原来想要的结果是自动匹配语言,之前不能实现。

我这里问题并没有解决……

如果不手动指定字体,系统界面和 Chrome 网页的中文字体都是某种宋体(我没有安装中易宋体等 Windows 字体),而且这个宋体 fc-match 看不到;

如果手动指定字体(我临时的解决方案),系统界面字体正常,Chrome 网页字体就变成字重和字形都不对的 *JP 。

你说的问题不是我原来说的问题,我也搞不懂字体的优先级匹配顺序。

有没有用我的 chrome 脚本?已经更新到 0.7.1。我指定的是微软雅黑和中易宋体。没有安装这两个的话只要改一下 mainCJKfont 和 qSimSun 两个变量的定义就好了。mainCJKfont 是主要中文字体。网页中没有显式指定中文字体的文字都是这个字体。qSimSun 是中英文混排的字体优先顺序。我的本意是把中英文混排中的宋体英文改成合适的英文字体,但是现在你也可以把 qSimSun 变量定义中的 SimSun 换成你需要的字体,这样网页中所有显式指定使用中易宋体的中文段落都用你指定的字体显示,而其中的英文是按照 qLatinSun 和 qLatin 的字体优先顺序显示的。

系统的字体优先级和网页的字体优先级是两回事。网页当然是按照网页的字体优先级来的。一般网页字体优先级列表的最后总放一个 serif 或者 sans-serif 。如果 css 字体优先顺序里的真实字体一个都没有,那么就调用浏览器的 serif 和 sans-serif 设定。如果浏览器设定为"default" 或者“sans/serif”,那这两个虚拟字体是按照系统的 serif 和 sans-serif 的优先级转化成真实字体的,否则就按照浏览器的设定走。

如果网页连 sans 和 serif 都没有放到字体列表里……那就按照浏览器的“默认设置”,在 Chrome/chromium 里就是 Standard font 那一栏。如果这一栏是 Sans,那就是按照系统的 sans 字体设定来。这种情况比如 freedesktop.org/software/fontconfig/fontconfig-user.html

我说的系统的。

之前试过你 0.5 的版本,效果不错,可惜只对部分网页的部分元素起作用。今天更新到 0.7.1 了,能起作用的网页更多了(赞一个),不过仍有部分网页元素不起作用,比如京东顶栏的下拉窗口(下拉菜单?不是很清楚这个东西叫什么)里面的字体还是老样子,还有 B 站的顶栏下拉也是;各种输入框和按钮上的字体也没有效果。

我对网页前端一窍不通,也没办法帮忙改进,总之是感谢分享吧。

吐个槽……字体配置真是巨坑啊,原本默认配置就非常完美了,自从这个字体包变化之后(不是反对字体合包,就是单纯指这个时间节点),折腾了这么久还是搞不好……

这个宋体我也搞清楚了,是 texlive 的字体。然而禁止它们在系统中的使用(把 /etc/fonts/conf.avail/58-texlive-*.conf 链接到 /etc/fonts/conf.d/ 下面),然后在保持系统默认配置(不手动为 fonts-config 指定字体)的情况下,我的系统显示中文字体依然是日文字形……也就是楼主最开始提出的问题吧?

这时候 Chrome 的字体就更没法看了(关掉调整字体的脚本的情况下),不止字形不对,字重是忽粗忽细啊,这画面太美……



没效果的网页可以给个网址和截图哈。你说的是“我的京东”那些弹出菜单吗?在我这里是管用的哈。我更新到了 0.7.2(见下),就是增加了一个叫做"mySongTi" 的变量,变量内容是中易宋体(“SimSun”)的替换字体。现在直接改这个变量和 mainCJKfont 就好了。下面的代码文泉驿微米黑 (WenQuanYi Micro Hei) 为例,

// ==UserScript==
// @name         RealCJKBold
// @namespace    https://forum.suse.org.cn/
// @version      0.7.2
// @description  Use CJK fonts explicitly!
// @author       stecue@gmail.com
// @match        http://*/*
// @match        https://*/*
// @grant        none
// ==/UserScript==
(function () {
    'use strict';
    var all = document.getElementsByTagName('*');
    for (var i = 0, max = all.length; i < max; i++) {
        var child = all*.firstChild;
        var texts = 
        ];
        var if_replace = false;
        var sig_sun='RealCJKBold 宋';
        var sig_hei='RealCJKBold 黑';
        var qsig_sun='"'+sig_sun +'"'; //Quoted sinagure;
        var qsig_hei='"'+sig_hei +'"'; //Quoted sinagure;
        var mainCJKfont = 'WenQuanYi Micro Hei'; //The "good main CJK font" to replace SimSun bold.
        var mySongTi='WenQuanYi Micro Hei';
        var qpreCJK = '"' + mainCJKfont + '"'; //Quoted "CJK font".
        var qLatin = '"Trebuchet MS"';
        var qLatinSun = '"Ubuntu Mono","Liberation Serif","Times New Roman"';
        var qCJK = qLatin + ',' + qpreCJK+','+qsig_hei;
        var qSimSun = qLatinSun+','+qLatin + ','+mySongTi+','+qsig_sun;
        var qsans = '"Lucida Grande",Arial,' + qCJK;
        var qserif = '"Times New Roman",' + qCJK;
        var qmono = '"DejaVu Sans Mono",' + qCJK;
        //Only change if current node (not child node) contains CJK characters.
        var font_str = window.getComputedStyle(all*, null).getPropertyValue('font-family');
        var fweight = window.getComputedStyle(all*, null).getPropertyValue('font-weight');
        while (child) {
            if (child.nodeType == 3) {
                if (font_str.match(/simsun|宋体 /gi)) {
                    //Change SimSun for all characters
                    //alert(window.getComputedStyle(all*, null).getPropertyValue('font-weight'));
                    //alert('SimSun detected');
                    if (fweight == 'bold' || fweight > 500) {
                        //all*.style.color="Blue";
                        if (font_str.match(sig_hei)) {
                            //do nothing if already replaced;
                            //all*.style.color="Red";
                            //continue;
                            //alert('Matched already');
                            if_replace=false;
                        }
                        else {
                            //all*.style.color="Green";
                            //alert(font_str);
                            all*.style.fontFamily = font_str.replace(/\'\"]?simsun|宋体\'\"]?/gi, qCJK);
                            if_replace=false;
                        }
                    }
                    else {
                        //all*.style.color="Orange";
                        if (font_str.match(sig_sun)) {
                            //do nothing if already replaced;
                            //all*.style.color="Grey";
                            if_replace=false;
                        }
                        else {
                            //all*.style.color="SeaGreen";
                            all*.style.fontFamily = font_str.replace(/\'\"]?simsun|宋体\'\"]?/gi, qSimSun);
                            //alert(font_str);
                            if_replace=false;
                            //continue;
                        }
                    }
                    break;
                }
                if (child.data.match(/\u3400-\u9FBF]/)) {
                    if_replace = true;
                    break;
                }
            }
            child = child.nextSibling;
        }

        if (if_replace === true) {
            //continue;
            //Adding ">" to the left and "<" to the
            //all*.lang="en";
            //alert("SimSun found!");
            if (font_str.match(mainCJKfont)) {
                continue; //Skip if already in Microsoft YaHei;
            }
            else if (font_str.match(',')) {
                var font_last = font_str.split(',').pop();
                //alert(font_str);
                if (font_last.match(/\'\"]?sans\'\"]?|\'\"]?sans-serif\'\"]?|\'\"]?sans serif\'\"]?/gi)) {
                    all*.style.fontFamily = font_str.replace(font_last, qsans + ',' + font_last);
                }
                else if (font_last.match(/\'\"]?serif\'\"]?/gi)) {
                    all*.style.fontFamily = font_str.replace(font_last, qserif + ',' + font_last);
                }
                //Mediawiki does not put monospace in the last...
                else if (font_str.match(/\'\"]?monospace\'\"]?/gi)) {
                    all*.style.fontFamily = font_str.replace(/monospace/gi, qmono + ',' + 'monospace');
                }
                else {
                    //Just add the main font for all other cases;
                    all*.style.fontFamily = font_str + ',' + qCJK;
                }
            }
            else
            {
                if (font_str == 'sans' || font_str == 'Sans' || font_str == 'sans-serif' || font_str == 'Sans-Serif' || font_str == 'sans-Serif' || font_str == 'Sans-erif') {
                    all*.style.fontFamily = qsans + ',' + font_str;
                }
                else if (font_str == 'serif' || font_str == 'Serif') {
                    all*.style.fontFamily = qserif + ',' + font_str;
                }
                else if (font_str == 'Mono' || font_str == 'mono' || font_str == 'Monospace' || font_str == 'monospace') {
                    all*.style.fontFamily = qmono + ',' + font_str;
                }
                else {
                    all*.style.fontFamily = font_str + ',' + qCJK;
                }
            }
        }
    }
}) ();

输入框的问题目前还很难解决,因为输入框一般是 JavaScript 做出来的,我还没搞明白如何让它被另外一个 JavaScript 控制。知乎的登录界面就是这样。可能需要在某个地方进行全局设置,但是又怕误伤太多。Anyway,欢迎提供例子哈,我好有针对的改进!要不然我只能保证我常去的网站没什么大问题呼呼。*********************

Chrome 有问题的话试一下我的脚本? [用 fontconfig 和 TamperMonkey 解决 Chrome 中文粗体(以及常规字体)问题) (可能需要把雅黑和 SimSun 替换成其他字体)

“user default” 就是系统默认字体。试一下
FC_DEBUG=4 pango-view --font=“serif” -t ‘中文字体测试’ 2>&1 | grep -o ‘family: “^”]+’ | cut -c 10- | tail -n 1
, 应该可以看到那是什么奇怪的字体。“霜”和“头”各试一下应该就知道了。参见 repolinux.wordpress.com/2013/03/10/find-out-fallback-font-used-by-fontconfig-for-a-certain-character/

试了一下,感觉跟 0.7.1 没什么区别……附上截图:






这个在系统默认的设置下结果是 Droid Sans Japanese 和 Noto Sans CJK JP ,所以也就是说当我不启用你的那个脚本也不手动给 fonts-config 指定字体的情况下,Chrome 的显示效果中较粗的是 Droid Sans Japanese ,细的是 Noto Sans CJK JP 。

搞明白了! ** 论坛编辑器自作聪明地在中英文间加了空格,把我发出来的代码自动改错了。 ** 这导致“宋体”无法匹配,相关替换也无法进行。我已更新脚本至 v0.8 并添加了相关说明。( [用 fontconfig 和 TamperMonkey 解决 Chrome 中文粗体(以及常规字体)问题) )。这是一个重要更新,可以方便的设置中英文字体。而且开启强力字体修正的话,至少京东页面好像还没有字体误用的情况。;p



上图中字体为文泉驿微米黑(“WenQuanYi Micro Hei”)。