✍️ 田冬冬 , 陈箫翰 • 📅 2025-12-27

# Windows 下的 GMT 中文支持（GB编码）

## Ghostscript 的中文支持

GMT 需要使用 Ghostscript 将 PostScript 文件转换为 PDF、JPG 等格式的图片。 PostScript CID 字体（Character Identifier Font，字符标识符字体）是 Adobe Systems 为解决大字符集语言（主要是中文、日文、韩文，合称 CJK）的排版和打印问题而开发的一种字体格式架构， 专门为了让电脑和打印机能够高效处理成千上万个汉字。 但 GMT 安装包中内置的 Ghostscript 是一个精简的版本，缺失了支持 CID 字体的必要文件，因此 不支持中文。

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

Ghostscript 完整版安装包下载地址:

- gs10060w64.exe（64 位）

警告

请注意 Ghostscript 的版本！ 由于 Ghostscript 自身的 bug，请勿使用 9.27、9.51 和 9.52 版本的 Ghostscript。 此外某些 GMT 和 Ghostscript 的版本组合会造成半透明效果失效等等诸多问题， 对于 GMT 6.4.0 及其他较低版本，建议使用 Ghostscript 9.53-9.56； 对于 GMT 6.5.0 则建议使用 Ghostscript 10.03 之后的新版本。

在安装 Ghostscript 的过程中，会有一个生成 cidfmap 的选项 `Generate cidfmap for Windows CJK TrueType fonts`。 选中该选项则表示会为当前系统自动生成中文所需的 cidfmap 文件。默认该选项是被选中的，一定 不要 将该选项取消。

完成后打开命令提示符 cmd，输入以下命令。如果操作正常那么命令都只有一个输出结果：

    C:\Windows\system32> where gmt
    c:\programs\gmt6\bin\gmt.exe
    C:\Windows\system32> where gswin64c
    C:\Program Files\gs\gs10.06.0\bin\gswin64c.exe

如果出现多个结果，说明系统中同时存在多个 GMT 或 Ghostscript。这种情况极易发生冲突和中文乱码。 用户需要仔细检查步骤是否有错漏，并卸载多余的软件。

## GMT 的中文支持

打开命令提示符 cmd，输入以下命令创建 GMT 配置文件目录，并创建 GMT 自定义字体配置文件：

    C:\Windows\system32> cd /d %USERPROFILE%
    C:\Users\当前用户名> if not exist .gmt mkdir .gmt
    C:\Users\当前用户名> cd .gmt
    C:\Users\当前用户名\.gmt> notepad PSL_custom_fonts.txt

向 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` 表示竖排文字。 强烈建议在脚本中直接使用字体名字（如 `STSong-Light--GB-EUC-H`）而不是字体编号。

## GMT 中文测试

备注

请自行确认你的中文字体配置。

警告

目前发现 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,STHeiti-Regular--GB-EUC-H,black
    gmt set FONT_LABEL 15p,STSong-Light--GB-EUC-H,black

    REM GMT 6.3 及之后的版本连续使用echo命令输出含中文的文件时，必须在开始设置 chcp 936，即 GB 编码
    chcp 936
    echo 2 3.5 25p,STSong-Light--GB-EUC-H,black 中文宋体  > tmp
    echo 2 2.5 25p,STFangsong-Light--GB-EUC-H,blue  中文仿宋 >> tmp
    echo 2 1.5 25p,STHeiti-Regular--GB-EUC-H,red   中文黑体 >> tmp
    echo 2 0.5 25p,STKaiti-Regular--GB-EUC-H,green 中文楷体 >> tmp
    echo 4 3.5 25p,STSong-Light--GB-EUC-V,black 中文宋体 >> tmp
    echo 5 3.5 25p,STFangsong-Light--GB-EUC-V,blue  中文仿宋 >> tmp
    echo 6 3.5 25p,STHeiti-Regular--GB-EUC-V,red   中文黑体 >> tmp
    echo 7 3.5 25p,STKaiti-Regular--GB-EUC-V,green 中文楷体 >> tmp

    REM GMT 6.3 及之后的版本每句使用中文的命令之前必须设置 chcp 936，即 GB 编码
    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` ，即 GB 编码。否则将出现乱码:

    chcp 936

成图效果如下：