一个解决 Linux 版 Dota 2 中 CJK 字符显示成方块的 Workaround

不知道从什么时候开始,Linux 版本的 Dota 2 中载入界面的 tips sentences 和 player name 中的中文会显示成方框,详见 issue-1688。V社基本没搭理这个 bug,只好自己动手修。

猜想是游戏内直接使用了某个字体,或者该字体不存在时调用了默认字体,但是他们不支持 CJK 字符,所以显示成方块。因为 SteamFonts 给的全是Arial字体,我猜 Dota 2 那些文本使用的字体可能是Arial,开FC_DEBUG跑了一遍发现猜的没错。那么我们要做的就是用fontconfigArial替换成支持中文的字体。

解决办法

替换Arialfontconfig配置是:

<match target="pattern">
  <test qual="any" name="family">
    <string>Arial</string>
  </test>
  <edit name="family" mode="assign" binding="same">
    <string>Noto Sans S Chinese</string>
  </edit>
</match>

我用的是Noto Sans S Chinese,如果用文泉驿正黑就改成WenQuanYi Zen Hei

怎么使这个配置生效?有两个方法。

环境变量 FONTCONFIG_FILE

这个方法需要一个为 Dota 2 单独准备的fontconfig_file,姑且命名为dota2-fontconfig.conf

文件内容如下:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <include ignore_missing="no">fonts.conf</include>

  <match target="pattern">
    <test qual="any" name="family">
      <string>Arial</string>
    </test>
    <edit name="family" mode="assign" binding="same">
      <string>Noto Sans S Chinese</string>
    </edit>
  </match>
</fontconfig>

然后用FONTCONFIG_FILE环境变量来传递。但是使用这个环境变量之后,fontconfig不会再加载/etc/fonts/fonts.conf,所以这里把这个文件也包含进来。1

然后这样打开 Steam:

export FONTCONFIG_FILE=/path/to/dota2-fontconfig.conf
steam

再运行 Dota 2 就不会有方块的困扰了。

写进fonts.conf

另一个方法是直接把字体替换的配置写进fonts.conf,比如~/.fonts.conf或者$XDG_CONFIG_HOME/fontconfig/fonts.conf

当然这个方法并不推荐,因为会影响到其他程序。

Update 2015-05-29

可能每次都要用命令行启动 Steam 不太方便,下方评论里有解决办法。就是给 Dota 2 加个启动选项。


  1. fonts-conf ↩︎