2016-08-24

VMware虚拟机折腾Arch Linux(3)中文显示支持及字体渲染优化

第三部分:中文显示支持及字体渲染优化


默认设置安装的Arch是不支持中文显示的,试着打开中文txt文件或这网页,显示都是小方块乱码。

下面是保持英文界面不变的情况下,添加中文显示支持的办法。

强烈不建议将整个界面都改成中文显示,会有很多小的技术细节和翻译术语问题。

目前主流的操作系统和软件,都能够(或者说应该能够)保证任何国家/语言的用户,无障碍(无乱码)的阅读任何语言的文档及网页。

比如,一个英国人很可能使用英文菜单及英文错误信息的操作系统,但他依然可能需要阅读某些中日韩文字的文档和网页。类似的,一个法国用户也可能需要在某些时候输入日文。

所以,中日韩字符的显示和输入法不应以中文界面为前提,因为正确显示中日汉字符和操作系统菜单的语言没有必然联系。

最后,即便是中日韩(CJK)也是三种不同的文字啊,很可能一个简体中文用户,除了输入简体中文,也需要输入日文和韩文。总不能为了输入日本,就把整个操作系统改成日文的吧?

然而,非常遗憾的是,Arch的官方Wiki以及Google搜索到的很多资料,都仅仅提供了将操作系统改为特定区域,然后才能正常显示/输入与之一致的语言。例如,为了显示简体中文和输入简体中文,必须修改当前用户的文件“~/.xinitrc”和“~/.xprofile”,设置export LANG=zh_CN.UTF-8,export LANGUAGE=zh_CN:en_US。这其实是强制设置了简体中文,如果CJK的J(日文)和K(韩文)显示出了问题,Wiki和教程根本就帮不上忙。因为搜索日文显示问题,会要求将区域设置成日文。

经过上述分析可知,就汉字(准确的说是中日韩文字) 显示来说,不需要针对区域/语言等进行任何设置,或者说可以随意设置区域和语言,完全不会(也不应该)对中文显示构成影响。

因为,即使是英国人,阿拉伯人用的电脑(显然他们的区域/语言设置不可能是zh_CN),他们在浏览中文网站或含有中文的页面时也应该正确显示中文汉字。

所以下面关于区域,语言的设置可以忽略,因为这些不是显示汉字所必须的。

真正必须的是,一定要安装一个支持中日韩语言的字体。
(Arch Linux和Windows 7等操作系统一样——英文版,阿拉伯文版等操作系统,只要安装了中文字体,就可以正确显示中文。系统的区域,时区设置,首选语言等设置并不影响中文网页和文档的显示。)

这里是Arch中文显示支持的官方Wiki,https://wiki.archlinux.org/index.php/Arch_Linux_Localization_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

由于区域和语言设置不是必须的,所以这里直接跳过这些设置。


中文字体和字体渲染

此时打开中文网页依然是乱码,因为缺少中文字体。
并且此时字体渲染显示效果可以用“惨不忍睹”来形容,甚至不如Ubuntu,更别说跟Windows比了。
这是字体和字体渲染问题,Windows有Clear Type向导用于优化字体渲染。Arch可以用下面的办法:

编辑配置文件,添加bohoomil来源,以便安装第三方字体渲染软件infinality,
nano /etc/pacman.conf:

添加下面的文字:
[infinality-bundle]
Server = http://bohoomil.com/repo/$arch

[infinality-bundle-multilib]
Server = http://bohoomil.com/repo/multilib/$arch

[infinality-bundle-fonts]
Server = http://bohoomil.com/repo/fonts

保存并退出。

运行命令更新一下系统,
pacman -Syu
会提示error,需要更新key。

运行下面的命令添加key,
pacman-key -r 962DDE58
pacman-key --lsign-key 962DDE58

再次更新一下系统,
pacman -Syyu

安装infinality,
pacman -S infinality-bundle infinality-bundle-multilib ibfonts-meta-extended

安装字体设置工具,
pacman -S fontconfig

开一个终端,运行命令进行字体设置,
fc-presets set
1) combi
2) free
3) ms
4) reset
5) quit
Enter your choice...

选择3,也就是微软Windows风格的字体渲染效果,重启生效,
reboot

infinality默认会安装Google Noto CJK字体,相当牛的字体,支持任何UTF语言的文字显示,当然也包括简体中文,正体中文,日文和韩文。

综上所述,不需要任何特别的区域,语言设置。
只要安装infinality就可以支持中文显示了,因为infinality自动安装了CJK字体。
同时infinality还可以调整文字渲染,使显示效果更漂亮。
infinality是个一举两得的好东西!

infinality的Google Noto字体bug

重启之后会发现:
  1. 字体变漂亮了,不仅中文字体,连英文字体也变得更清晰漂亮了;
  2. 个别中文字符明显有问题,比如“关”,“门”等。
下面这几个汉字显示有问题:
关 (U+5173)
复 (U+590D)
甩 (U+7529)
门 (U+95E8)

这是有问题的显示截图(Snapshot of Google Noto 1.004 CJKjp bug)


这是正确的显示效果(Snapshot of correct Chinese sinograms)


Noto字体确实有过bug,具体见这里, https://github.com/googlei18n/noto-fonts/issues/151
但是Google说在Noto的1.002版已经修复了,然而实测发现,infinality安装的是Noto 1.004,可是问题依旧。

直接到Google Noto字体官网,https://www.google.com/get/noto/,下载476.2MB的zip包手动安装也一样有问题。

具体问题出在那几个CJKjp的字体文件上。

恕本人愚钝,实在是不明白为什么中文显示时infinality会自动选中那些CJKjp字体,而不是选择更正常的CJKsc;而且也实在是搞不明白如何修改配置来强制使用CJKsc字体显示简体中文。

似乎跟区域也没有关系,即使删除所有的区域,仅保留zh_CN.UTF-8,并且将操作系统界面设置成简体中文,infinality依然会坚持选择CJKjp字体。

猜测:
  1. infinality有问题:在选择字体时认为任何CJK字体应该都可以同时正常显示所有中日韩字符,事实上也应该如此,所以infinality选择第一个可用的CJK字体,也就是CJKjp。
  2. Google Noto字体有问题:理论上,任何CJK字体,均应该可以同时正常显示所有中日韩字符。然而,同样是Noto的CJK,CJKsc可以正常显示中日韩,但是CJKjp却在显示个别汉字时出现错误,这应该是bug。
总结一下,如果infinality能够配置使用CJKsc字体渲染简体中文,应该可以解决上面问题;或者,如果Google Noto字体的CJKjp字体做到同时正常显示所有中日韩字符,应该也可以解决上述问题。

然而,infinality和Google Noto目前的版本都没有解决上述问题;或者是本人不知道正确的设置方法。

修复bug

运行命令看一下CJK字体的优先级,可以看到默认选中的是CJK  JP,所以有些中文汉字被显示成了日文汉字。
fc-match sans-serif -s|grep 'CJK'

回显:
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

强制CJK字体优先级:
nano /etc/fonts/conf.d/64-language-selector-prefer.conf

向文件中粘贴下述内容
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <alias>
        <family>sans-serif</family>
        <prefer>
            <family>Noto Sans CJK SC</family>
            <family>Noto Sans CJK TC</family>
            <family>Noto Sans CJK JP</family>
        </prefer>
    </alias>
    <alias>
        <family>monospace</family>
        <prefer>
            <family>Noto Sans Mono CJK SC</family>
            <family>Noto Sans Mono CJK TC</family>
            <family>Noto Sans Mono CJK JP</family>
        </prefer>
    </alias>
</fontconfig>

再次查看CJK字体优先级,
fc-match sans-serif -s|grep 'CJK'

回显:
NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"
此时已经默认选中CJK SC了,也就是简体中文。

infinality的副作用——导致Opera乱码

无论如何设置,安装何种字体,只要安装了infinality,Opera就无法显示中日韩字符。官方Wiki没有提供详细的解释及解决办法,https://wiki.archlinux.org/index.php/Opera。但是这个Wiki似乎并不是针对infinality导致的问题。

下面问题截图。
 
图中Chromium,Firefox以及Konqueror均可以正确显示中文汉字(可见系统设置应该是正确的,字体是ok的,而且本人也知道如设置浏览 器以便正确显示中文汉字),惟独Opera的汉字显示是乱码,这应该可以说明Opera是有问题的;另一方面,Opera是安装infinality之后出现的乱码,下载infinality并随便安装一个CJK字体后,Opera就可以正常显示中日韩字符了,这说明infinality也是有问题的。

无论如何,是infinality和/或Opera的问题。与Arch Linux系统的区域/语言等设置无关,因为其他的浏览器已经在相同的设置下正确显示中文了。

没有评论:

发表评论