gnuplot / pngcairo无法正确呈现UTF-8字符

时间:2018-02-01 15:02:43

标签: unicode utf-8 gnuplot

我有两台CentOS 7.4.1708机器,运行gnuplot 4.6 patchlevel 2,  目前表现不同,我无法解决原因。

安装字体:

sudo yum install dejavu-sans-mono-fonts

然后创建以下GNUplot脚本:

cat << EOF > test.gnuplot
set terminal pngcairo enhanced font "DejaVuSansMono,10"
set encoding utf8
set title "同"
plot sin(x)
EOF

最后,将其输入应用程序:

cat test.gnuplot | gnuplot > test.png

在一台机器上我得到了这个:

Working as expected

但另一方面,我得到了这个:

Not working as expected

我无法解决这种差异的原因。所需的字符 U + 540C,所以它不像第二台机器以任何不同的方式解释输入字节;它只是不渲染字形。

我应该寻找系统配置的哪些差异?

更广泛地说,我怎样才能修复&#34;第二种情况下的输出?如果某些角色最终被这样的占位符替换,我甚至不在乎(毕竟,我必须认识到并非所有字体都实现所有字形),但那些以超大尺寸渲染的占位符是< / em>一个问题。

1 个答案:

答案 0 :(得分:3)

这篇文章是一个观察集合,而不是一个完整的答案,但也许它也可能有用(我在几乎全新安装的CentOS上尝试了你的例子,它确实重现了你帖子中的第二个情节):

  1. 从命令

    打印的charset表判断
    fc-match -v DejaVuSansMono
    

    似乎确实不支持540C。也许第一台机器安装了一些额外的字体,用作这个特定字形的后备? fc-list的输出有何不同?

    很难说它是否完整,但支持此字形的list字体似乎相当有限。尽管如此,例如Google Droid可以通过yum获得,所以如果我这样做

    sudo yum install google-droid-sans-fonts google-droid-sans-mono-fonts
    

    并重新运行Gnuplot脚本,剧情以可接受的方式呈现。

  2. 对于“后备”框的大小,我首先注意到它的大小与指定的字体大小成正比,即如果将字体大小加倍,它也会加倍。从src/wxterminal/gp_cairo.c开始,Gnuplot默认使用“过采样”策略来渲染文本,即它以plot->oversampling_scale倍的分辨率呈现所有内容,然后将其缩放(通过在中定义的变换矩阵) void gp_cairo_initialize_context(plot_struct*))。 例如,在渲染文本时,它会调用

    pango_font_description_set_size(desc, \
        (int) (plot->fontsize*PANGO_SCALE*plot->oversampling_scale));
    

    但是,出于某种原因,“后备”框不会缩减,因此比指定的字体大小大plot->oversampling_scale倍。默认值plot->oversampling_scale设置为GP_CAIRO_SCALE20中定义为src/wxterminal/gp_cairo.h

    我下载了Gnuplot 4.6.2的来源,并将plot->oversampling = TRUE;替换为plot->oversampling = FALSE; void gp_cairo_initialize_plot(plot_struct*)中的src/wxterminal/gp_cairo.c。重新编译后,“后备”框的渲染大小与文本的其余部分相同。不幸的是,我还没有找到如何直接从Gnuplot改变这种行为的方法。