Windows 下的 GMT 中文支持

贡献者:

田冬冬, 陈箫翰

最近更新日期:

2022-06-21

ghostscript 的中文支持

GMT 需要使用 Ghostscript 生成 PDF、JPG 等格式的图片。如果没有正确配置 Ghostscript 的中文支持,GMT 生成的图片中的中文将会出现乱码。因此必须首先配置 Ghostscript 的中文支持,但 GMT 安装包中内置的 Ghostscript 不支持中文。

若需要 GMT 支持中文,则需要在安装 GMT 时不勾选 Ghostscript 组件,待安装完成后再自行安装 Ghostscript。对于已安装 GMT 的用户,建议先卸载 GMT,再按照《 Windows 下安装 GMT 》一节的步骤重新安装 GMT,安装过程中注意不勾选 Ghostscript。

Ghostscript 安装包下载地址:

警告

请注意 Ghostscript 的版本!由于 Ghostscript 自身的 bug,请勿使用 9.27、9.51 和 9.52 版本的 Ghostscript。此外 GMT 6.4 以及之前的版本有 bug,与 Ghostscript 10.0.0 不兼容,导致 GMT 6.4 + Ghostscript 10.0.0 的组合无法绘制出半透明效果的图片,请使用 GMT 6.5 + Ghostscript 10.03.0。

备注

安装 Ghostscript 的过程中记得勾选 Generate cidfmap for Windows CJK TrueType fonts 以生成中文字体配置文件。

在安装 ghostscript 的过程中,会有一个生成 cidmap 的选项,选中该选项则表示会为当前系统自动生成中文所需的 cidmap 文件。默认该选项是被选中的,一定 不要 将该选项取消。

为了能够在将PS文件转换为其他图片格式时也支持中文,需要设置环境变量 GS_FONTPATH。具体步骤如下:

  1. 点击“计算机”->“属性”->“高级系统设置”->“环境变量”打开“环境变量”编辑工具

  2. 在“系统变量”部分中,新建变量 GS_FONTPATH 并设置其值为 C:\Windows\fonts

GMT 的中文支持

新建GMT自定义字体配置文件 C:\Users\用户名\.gmt\PSL_custom_fonts.txt (注意 用户名 应该替换为实际的用户名。若不存在 C:\Users\用户名\.gmt 目录则需新建该目录。Win10 用户可以直接新建文件夹。Win7 的文件管理器无法新建以 . 开头的文件夹,因而需要打开CMD,然后执行命令 mkdir .gmt 以创建该文件夹)。

备注

Windows默认隐藏文件的扩展名。新手在新建这个字体配置文件时,常常将文件名错误写成 PSL_custom_fonts.txt.txt,导致中文字体添加失败。因此强烈建议在资源管理器 -> 查看中开启显示文件扩展名:

../../_images/chinese-extension.png

向 GMT自定义字体配置文件 C:\Users\用户名\.gmt\PSL_custom_fonts.txt 中加入如下语句:

STSong-Light--GB-EUC-H  0.700    1
STFangsong-Light--GB-EUC-H  0.700    1
STHeiti-Regular--GB-EUC-H   0.700   1
STKaiti-Regular--GB-EUC-H   0.700   1
STSong-Light--GB-EUC-V  0.700    1
STFangsong-Light--GB-EUC-V  0.700    1
STHeiti-Regular--GB-EUC-V   0.700   1
STKaiti-Regular--GB-EUC-V   0.700   1

gmt text -L 查看 GMT 字体:

$ gmt text -L
Font #  Font Name
------------------------------------
0   Helvetica
1   Helvetica-Bold
...    ......
39 STSong-Light--GB-EUC-H
40 STFangsong-Light--GB-EUC-H
41 STHeiti-Regular--GB-EUC-H
42 STKaiti-Regular--GB-EUC-H
43 STSong-Light--GB-EUC-V
44 STFangsong-Light--GB-EUC-V
45 STHeiti-Regular--GB-EUC-V
46 STKaiti-Regular--GB-EUC-V

可以看到,新添加的四种中文字体对应的字体编号为 39 到 46。其中 STSong-Light-GB-EUC-H 即为宋体,GB-EUC 是文字编码方式, H 表示文字水平排列,V 表示竖排文字。强烈建议在执行测试脚本前确认自己的中文字体编号。

GMT 中文测试

备注

请自行确认你的中文字体编号。如果编号不是39到46,请自行修改以下测试脚本。

警告

目前发现 Git Bash 运行Bash脚本时, echo 生成文件使用的是 UTF8 编码,从而可能会导致中文乱码。建议在有中文需求时使用bat脚本,或者避免在Bash脚本中使用 echo

使用记事本Notepad++ 的用户,应注意含中文的bat文件和输入数据文件都应以 ANSI 编码保存,使用其他编码方式则极可能出现乱码。Notepad++除了注意要选择 “ 编码 -> 使用ANSI编码 ” 以外,还应该选中“ 设置 -> 首选项 -> 新建 -> 编码 -> ANSI ”。

Visual Studio Code 用户,应注意确保含中文的bat文件和输入数据文件都采用 GB2312 编码方式。在Visual Studio Code右下角状态栏中可以查看并修改当前文件的编码方式。

gmt begin map pdf,png
REM GMT处理中文存在一些已知BUG
REM 需要设置 PS_CHAR_ENCODING  Standard+ 以绕过这一BUG
gmt set PS_CHAR_ENCODING Standard+
gmt set FONT_TITLE 25p,41,black
gmt set FONT_LABEL 15p,39,black

REM GMT 6.3 及之后的版本连续使用echo命令输出含中文的文件时,必须在开始设置 chcp 936
chcp 936
echo 2 3.5 25p,39,black 中文宋体  > tmp
echo 2 2.5 25p,40,blue  中文仿宋 >> tmp
echo 2 1.5 25p,41,red   中文黑体 >> tmp
echo 2 0.5 25p,42,green 中文楷体 >> tmp
echo 4 3.5 25p,43,black 中文宋体 >> tmp
echo 5 3.5 25p,44,blue  中文仿宋 >> tmp
echo 6 3.5 25p,45,red   中文黑体 >> tmp
echo 7 3.5 25p,46,green 中文楷体 >> tmp

REM GMT 6.3 及之后的版本每句使用中文的命令之前必须设置 chcp 936
chcp 936
gmt text tmp -R0/8/0/4 -JX12c/4c -Bxaf+l"X轴" -Byaf+l"Y轴" -BWSen+t"中文标题" -F+f
del tmp
gmt end

备注

GMT 6.x 目前在Windows下处理中文时存在BUG,可能会出现某些中文正常显示,某些不正常显示的情况。使用:

gmt set PS_CHAR_ENCODING Standard+

可临时避免这一BUG。

此外,GMT 6.3 及之后的版本每句使用中文的命令之前,以及使用echo命令输出含中文的文件之前,必须设置 chcp 936 ,否则将出现乱码:

chcp 936

成图效果如下:

../../_images/GMT_Chinese.png