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