nanguo@suse:~> fc-list :charset=1f40d
/usr/share/fonts/truetype/TwitterColorEmoji-SVGinOT.ttf: Twitter Color Emoji:style=Regular
** 为什么我输入法里的 emoji 是带颜色的,输出后就是黑白的了 **
nanguo@suse:~> fc-list :charset=1f40d
/usr/share/fonts/truetype/TwitterColorEmoji-SVGinOT.ttf: Twitter Color Emoji:style=Regular
** 为什么我输入法里的 emoji 是带颜色的,输出后就是黑白的了 **
遇过这个问题(我使用的是 noto color emoji),最后是通过配置 fontconfig 解决的,不过我并不会写配置,我直接拿 arch 那边的配置文件来用了。
https://aur.archlinux.org/cgit/aur.git/tree/75-noto-color-emoji.conf?h=noto-color-emoji-fontconfig
<?xml version="1.0"?>
<! DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- 设置 JetBrainsMono Nerd Font 为英文字体 -->
<match target="font">
<edit name="family" mode="prepend">
<string>JetBrainsMono Nerd Font</string>
</edit>
<test qual="any" name="lang">
<string>en</string>
</test>
</match>
<!-- 设置中文字体 -->
<match target="font">
<edit name="family" mode="prepend">
<string>SourceHanSansCN</string>
</edit>
<test qual="any" name="lang">
<string>zh</string>
</test>
</match>
<!-- Add generic family. -->
<match target="pattern">
<test qual="any" name="family"><string>emoji</string></test>
<edit name="family" mode="assign" binding="same"><string>Twitter Color Emoji</string></edit>
</match>
<!-- This adds Noto Color Emoji as a final fallback font for the default font families. -->
<match target="pattern">
<test name="family"><string>sans</string></test>
<edit name="family" mode="append"><string>Twitter Color Emoji</string></edit>
</match>
<match target="pattern">
<test name="family"><string>serif</string></test>
<edit name="family" mode="append"><string>Twitter Color Emoji</string></edit>
</match>
<match target="pattern">
<test name="family"><string>sans-serif</string></test>
<edit name="family" mode="append"><string>Twitter Color Emoji</string></edit>
</match>
<match target="pattern">
<test name="family"><string>monospace</string></test>
<edit name="family" mode="append"><string>Twitter Color Emoji</string></edit>
</match>
<!-- Block Symbola from the list of fallback fonts. -->
<selectfont>
<rejectfont>
<pattern>
<patelt name="family">
<string>Symbola</string>
</patelt>
</pattern>
</rejectfont>
</selectfont>
</fontconfig>
你首先得说是在什么程序里是黑白的,这个程序是像普通开源软件那样直接装在系统里的、使用系统库,还是自带了一堆库的闭源软件,又或者是 flatpak 这种容器解决方案?
这很好理解啊,你输入法的候选窗口用的是一个字体,输出到程序后,程序用的是另一个字体了。
恭喜你
你遇到了 Linux 字体方面最著名的 bug:想要显示 emoji。
用 append,是加到最后一个,那么排名靠前的字体里只要提供了跟 emoji 相同的 codepoint,就会用别的字体显示(现在字体都不同程度提供了 emoji)
用 prepend,emoji 字体的字间距很大,正常字体不能用这个间距显示。
不是字间距的问题,是某 emoji 字体包含了普通数字和空格……
Pango 通过「emoji」字族解决了这个问题,Qt 6.9 会跟进(补丁已合并)。
chromium 我不清楚,但是火狐我一直没遇到问题了。
我说的「解决了这个问题」不是指 Noto Color Emoji 的空格和数字,是指的 emoji 字符被用 DejaVu Sans 的黑白字符显示了。