---
author: 田冬冬
date: 2025-12-09
---

# 特殊字符

除了键盘上可以直接输入的一般字符之外，GMT还可以打印一些常用的特殊字符，
如大小写的希腊字母、加减号、大于等于号等。

这些特殊字符无法通过键盘直接输入，GMT中可以通过输入八进制码的方式指定特殊字符。

## 八进制码指定特殊字符

GMT中可以用一个三位的八进制码指定一个特殊字符。八进制码与特殊字符之间的对应
关系，可以通过查询下表得到：

:::{figure} GMT_stand+_iso+.*
:align: center
:width: 100%

ISOLation1+ 和 Standard+ 编码下的八进制码
:::

**下载：**
{download}`八进制码表 PDF 版 <GMT_stand+_iso+.pdf>` |
{download}`八进制码表 PNG 版 <GMT_stand+_iso+.png>`

**左右两张表分别是什么？该用哪一张？**
GMT支持多种字符编码，其中最常用的编码是 **Standard+** 和
**ISOLation1+**。通常，GMT的默认字符编码是 **ISOLatin1+**，所以只需要看左表即可；
如果当前字符编码是 **Standard+**，则需要查询右表。
可以通过 `gmt get PS_CHAR_ENCODING` 命令查到你所安装的GMT的默认字符编码方式。

如果查询到的字符编码是 **ISOLatin1** 或 **Standard**，则表格中的浅绿色扩展字符无法使用。
用户必须设置 {term}`PS_CHAR_ENCODING` 为 **ISOLatin1+** 或 **Standard+** 后才能正常使用这些扩展字符。

**这张表如何查询呢？**
假如你的GMT的默认字符编码方式为 **ISOLation1+** 编码。
假如想要输入加减号 `±`，查左表可知，加减号位于
第 **26x** 行、第 1 列，因而其八进制码为 `\261`。
而如果你的GMT默认字符编码为 **Standard+** 编码，
则 `±` 对应的八进制码则是 `\234`。因而，当你需要输入
某个特殊字符时，只需要输入其对应的八进制码即可。

## 使用12号或34号字体输入特殊字符

如果文本使用了12号字体（Symbol）或34号字体（ZapfDingbats），则此时八进制码
具有不同的含义。需要查询下表：

:::{figure} GMT_symbol_dingbats.*
:align: center
:width: 100%

Symbol和Pifont字体八进制码
:::

当文本字体为12号字体（Symbol字符集）时，应查询左表，例如字符 `λ` 对应的
八进制码为 `\154`。
当文本字体为34号字体（Pifont ZapfDingbats）时，应查询右表。

**下载：**
{download}`特殊字体八进制码 PDF 版 <GMT_symbol_dingbats.pdf>` |
{download}`特殊字体八进制码 PNG 版 <GMT_symbol_dingbats.png>`

## 特殊字符小结

GMT中特殊字符可以通过八进制码的方式输入。想要输入特殊字符，首先需要找到该字符
对应的八进制码。从上面四张表中找到自己需要的特殊符号的八进制码及其位于哪张表内。
总共分四种情况：

1. 字符在 **ISOLatin1+** 表内：可以直接使用该字符对应的八进制码
2. 字符在 **Standard+** 表内：该表内的字符是与 **ISOLatin1+** 中的字符完全重合的，
   建议在 **ISOLatin1+** 表中找到自己需要的字符，然后使用其对应的八进制吗
3. 字符在 **Symbol** 表内：将文本字体设置为12号字体，并使用该字符对应的八进制码
4. 字符在 **ZapfDingbats** 表内：将文本字体设置为34号字体，并使用该字符对应的八进制码

## 小练习

使用 **ISOLatin1+** 表中的八进制码输入字符 `± 234`:

```
echo 5 2 \261 234 | gmt text -Jx1c -R0/10/0/4 -Baf -pdf test
```

试验之后会发现，图上显示的是 `261 234` 而不是 `± 234`。产生这一现象的原因是
因为反斜杠在很多脚本语言里有特殊的含义，此处反斜杠首先被bash所解释，真正传给
GMT的是 `5 2 261 234`。针对这种情况，有四种解决办法:

```
# 1. 使用两个反斜杠来代替一个反斜杠
echo 5 2 \\261 234 | gmt text -Jx1c -R0/10/0/4 -Baf -pdf test

# 2. 使用单引号将字符串括起来
echo 5 2 '\261 234' | gmt text -Jx1c -R0/10/0/4 -Baf -pdf test

#. 3. 使用EOF输入字符串
gmt text -Jx1c -R0/10/0/4 -Baf -pdf test << EOF
5 2 \261 234
EOF

#. 4. 从文本文件中读取字符串
gmt text input.txt -JX10c/10c -R0/10/0/10 -F+f15p,12 -pdf test
```

输入希腊字母，此时需要指定文本使用12号字体（即 **-F+f15p,12** 选项）:

```
echo 5 5 '\141' | gmt text -JX10c/10c -R0/10/0/10 -Baf -F+f15p,12 -pdf test
```

如果需要在一堆正常字符中插入一个Symbol表中的特殊字符，
可以使用转义字符（下一节会详细介绍） **@~** 或 **@%12%** 临时将字体Symbol字体。
例如:

```
gmt basemap -R0/10/0/10 -JX10c/10c -BWSne -Bx2+l"T@~\161@~t" -pdf test
```
