flathub/com.qq.QQ

Debian 下 flatpak 中 Noto Sans CJK 显示问题

Closed this issue · 8 comments

运行环境:Debian 12 (bookworm - testing),

问题描述:中文环境下,系统默认使用 fonts-noto-cjk 这一字体软件包,使用 flatpak 安装 com.qq.QQ 后启动 QQ,
输入“门,关,房“等字符,会发现错误的使用了 Noto Serif CJK JP 字形。

分析:可能与 简体中文本地化 - Arch Linux 中文维基 中“修正简体中文显示为异体(日文)字形“一节中描述的问题类似,
在这一场景中,flatpak 中 QQ 使用了系统字体,但是 Debian 使用的软件包 fonts-noto-cjk 中包含了 /etc/fonts/conf.d/70-fonts-noto-cjk.conf 这一文件用来指定 CJK 字形,而 flatpak 中的 QQ 没有这一配置:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test name="lang">
            <string>ja</string>
        </test>
        <test name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend">
            <string>Noto Serif CJK JP</string>
        </edit>
    </match>
<!-- 省略 -->
    <match target="pattern">
        <test name="lang">
            <string>zh-cn</string>
        </test>
        <test name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Serif CJK SC</string>
        </edit>
    </match>
<!-- 省略 -->

这是因为每个程序中可以设置不同的默认字体,比如 Arial 或者 Tahoma,而这些字体的属性由 fontconfig 控制,其使用顺序是据地区代码以 A-Z 字母表顺序成默认排序,由于 ja-JP 在 zh_{CN,HK,SG,TW} 之前,故优先显示日文字形。

最终 QQ 使用了 Noto Serif CJK JP 字形。

临时解决方案:
创建文件夹 $HOME/.var/app/com.qq.QQ/config/fontconfig/conf.d/,参考 Wiki 链接,手动添加 fontconfig 配置指定字形。

例如在 Debian 下如果安装了 fonts-noto-cjk

mkdir -p $HOME/.var/app/com.qq.QQ/config/fontconfig/conf.d/
cp /etc/fonts/conf.d/70-fonts-noto-cjk.conf $HOME/.var/app/com.qq.QQ/config/fontconfig/conf.d/

建议直接修改flatpak配置文件。

文件:$HOME/.local/share/flatpak/overrides/global

内容:

[Context]
filesystems=xdg-config/fontconfig:ro;

建议直接修改flatpak配置文件。

文件:$HOME/.local/share/flatpak/overrides/global

使用 Flatseal 添加全局文件系统配置,经测试问题仍然存在,原因未知

Fontconfig 对我来说完全是个迷,加上 flatpak 更难弄清楚到底问题出在哪;不过到目前为止,修改 $HOME/.var/app/com.qq.QQ/config/fontconfig/conf.d/ 的方法能正常工作。

经过一番研究,flatpak 应该是在容器内(请原谅我使用这个词)映射了宿主的字体目录(通过 /etc/fonts/conf.d/50-flatpak.conf),但是没有映射宿主的 /etc/fonts/。完整的 noto 字体安装需要配备相应的 fontconfig 文件,所以 qq 使用了 noto 但是没能正确处理 CJK 问题。

也许应该捆绑一份字体和对应配置用来解决这个问题?至少应该保证开箱即用的情况下正确的字体显示。但是考虑到不同的用户状况和需求(比如安装了不同的字体;希望使用不同的字体显示;)这不一定是最好的解决办法。而且也不是所有用户都安装 fonts-noto-cjk...


使用 Flatseal 添加全局文件系统配置,经测试问题仍然存在,原因未知

看上去这样做是映射了用户的 $HOME/.config/fontconfig 到容器内,但是我的 $HOME/.config/fontconfig 是空的,所以不工作。这一解决方案应该是有效的,但是我不想污染 fontconfig 配置

链接/usr/share/fonts到本地的 /.local/share/fonts
然后加权限

@jcleng 可否提个PR?我来merge进去。

fixed by #32