本文已加入专栏文章目录,归入「基本使用」文章系列。
由于我们几乎不能为 LaTeX 用户群预设任何计算机基础,文章开头(不得不)为编码提供简单(而拙劣的)介绍。
关于编码,有很多权威而详细的介绍,限于知识水平和时间精力,笔者暂不提供资源链接。
关于编码
计算机中的每个文件,都可看作是一长串数字。
数字的表示涉及进制,人喜欢十进制,计算机喜欢二进制。用二进制表示数字时,数字位数增长太快(例如十进制的 1024,用二进制表示是 1,000,000,000),人直接阅读有困难。作为折衷,常用八进制和十六进制。
文本编码,可以认为是一个很长的两列表格,一列包含从 0 开始递增的数字,一列包含符号。以这样的方式,文本编码为符号和数字建立了一一对应关系。例如,ascii 编码包含这样的对应关系 a <-> "61
,b <-> "62
,1 <-> "31
(数字均使用十六进制)。
文本文件是一类(几乎)只储存文本的文件。关于文件的基本操作是读和写。
- 在写入一个文本文件时,用户通过屏幕显示的符号确认要写入的内容,程序把这串内容按照选定编码中的对应关系转换为数字,写入文件
- 在读取一个文本文件时,程序把文件中的数字串,按照选定编码中的对应关系转换为符号串,输出在屏幕上,供用户阅读。
举个例子,
- 使用 ascii 编码,创建一个包含符号
aba
的文本文件。
程序根据 ascii 编码中包含的对应关系a <-> "61
和b <-> "62
,把符号串aba
转换为数字串"616261
(数字均使用十六进制),写入文件。 - 接着,使用 ascii 编码,读取刚创建的文本文件 。
程序根据文件中储存的数字串"616261
,和 ascii 编码中的对应关系,把数字串转换为符号串aba
,然后输出在屏幕上。
(此处省略了关于编码长度的讨论。ascii 编码是定长编码,指每一个符号都对应一个两位的十六进制数)
有很多不同的编码。编码之间的差异,主要在于
- 定义的符号数量
- 相同符号对应的数字(假设定义了相同符号)
- 符号对应数字(用二进制表示时)的长度
关于乱码
如果读取和写入时用的编码不同,就可能导致乱码。乱码只发生在读取时,它有两种定义,
- 转换出的符号串,其整体或局部,对人而言是无意义的符号串
- 转换出的符号串,和存储时(人确认过)的符号串不同
对人而言,看出乱码主要基于第一种定义,即基于假设,一个文本文件包含的符号串对人而言应当具有某种意义。由于意义是相对的,第二种定义在判断是否发生了乱码时更为准确。继续上面的例子
- 假设有一个 iicsa 编码,它规定了一个符号和一个一位的十六进制数字之间的对应关系,例如
a <-> "1
,b <-> "2
,f <-> "6
。 - 如果我们用 iicsa 编码解析前面例子中的数字串
"616261
,得到的将是符号串fafbfa
,这就产生了乱码
解决乱码的一般步骤是
- 发现乱码时,不对该文件进行修改(特指不要保存)
- 猜测和了解文件储存时使用的编码(这一步最困难,因为有猜的成分[1])
- 用新编码读取该文件
- 如有需要,将文件另存为新编码
LaTeX 中会遇到的乱码,以编辑器 texstudio 为例
.tex
文件,是文本文件- texstudio 默认以 UTF-8 编码读取文件
- 有些包含中文的
.tex
文档,可能以其他编码储存,以 GBK 编码较为常见 - 如果用 texstudio 以 UTF-8 编码打开以 GBK 编码储存的文件,呈现在屏幕的字符串中,原本是中文的部分就会显示为乱码
假设我们发现了一个用 texstudio 打开时乱码的 .tex
文件。根据上一节中介绍的「解决乱码的一般步骤」逐步操作。
第一步,不对该文件进行修改(特指不要保存)。
小心即可。
第二步,猜测和了解文件储存时使用的编码。
这一步可以用带自动编码探测功能、修改读取时编码更为便利的编辑器(例如 Atom 和 visual studio code)。这里我们假设该文件储存时用的是 GBK 编码。(在文件包含中文,且曾由 Windows 系统写入时,这种假设是靠谱的。)
第三步,用新编码读取该文件。
首先,在 texstudio 界面右下角点击当前编码 UTF-8,然后选择 "More Encodings..."
接着,在弹出的小窗口中,找到第 18 行的 GBK,点击选中这行,再按小窗口右下角的 "Reload With",让 texstudio 以 GBK 编码重新打开当前文件。
这样,如果文件在以乱码形式打开后没有修改并保存过,且该文件确实是以 GBK 储存的,那么就能在 texstudio 里正常预览、修改储存和编译了。
第四步,如有需要,将文件另存为新编码
这一步可选。对 .tex
文件而言,我们推荐使用 UTF-8 编码。另存为新编码,也可以分为几步
- 找一个软件,打开该文件并正常显示不乱码。这个软件可以是 texstudio,也可以是记事本、浏览器、其他编辑器等等。
- 在不乱码的状态下,全选复制该文件中的所有内容。
- 用 texstudio(也可以是其他软件)新建一个 UTF-8 编码的文件,把刚才复制的内容粘贴进去,确认显示无乱码,保存。
- 重命名新文件、备份旧文件等后续事项。
结束。
补充
如果不需要另存为新编码,又经常需要使用 texstudio 打开非 UTF-8 编码的文档,还不想修改 texstudio 打开文件时默认使用的编码,可以在文档正常打开显示后,在 .tex
文件的首行插入 magic comment % !TeX encoding = GBK
,引导编辑器总是以指定编码打开当前文档。这一步可以简化为下图中的操作。
关于 TeX 里的编码
- TeX 内部还有一个带「编码」的概念,字体编码(font encoding)。本文不涉及字体编码。
- 一个 LaTeX 项目加载的所有文本文件,最好使用相同编码。例如,一个加载了
.bib
文件的main.tex
文件,.bib
和.tex
文件最好以相同的编码储存,否则可能出错。
参考
- ^例如这里的讨论 https://softwareengineering.stackexchange.com/q/187169