fwrite写入文件乱码_[LaTeX 使用] 编码简介;编辑器显示乱码的解决方案

本文已加入专栏文章目录,归入「基本使用」文章系列。

由于我们几乎不能为 LaTeX 用户群预设任何计算机基础,文章开头(不得不)为编码提供简单(而拙劣的)介绍。

关于编码,有很多权威而详细的介绍,限于知识水平和时间精力,笔者暂不提供资源链接。

关于编码

计算机中的每个文件,都可看作是一长串数字。

数字的表示涉及进制,人喜欢十进制,计算机喜欢二进制。用二进制表示数字时,数字位数增长太快(例如十进制的 1024,用二进制表示是 1,000,000,000),人直接阅读有困难。作为折衷,常用八进制和十六进制。

文本编码,可以认为是一个很长的两列表格,一列包含从 0 开始递增的数字,一列包含符号。以这样的方式,文本编码为符号和数字建立了一一对应关系。例如,ascii 编码包含这样的对应关系 a <-> "61b <-> "621 <-> "31(数字均使用十六进制)。

文本文件是一类(几乎)只储存文本的文件。关于文件的基本操作是读和写。

  • 在写入一个文本文件时,用户通过屏幕显示的符号确认要写入的内容,程序把这串内容按照选定编码中的对应关系转换为数字,写入文件
  • 在读取一个文本文件时,程序把文件中的数字串,按照选定编码中的对应关系转换为符号串,输出在屏幕上,供用户阅读。

举个例子,

  • 使用 ascii 编码,创建一个包含符号 aba 的文本文件。
    程序根据 ascii 编码中包含的对应关系 a <-> "61b <-> "62,把符号串 aba 转换为数字串 "616261(数字均使用十六进制),写入文件。
  • 接着,使用 ascii 编码,读取刚创建的文本文件 。
    程序根据文件中储存的数字串 "616261,和 ascii 编码中的对应关系,把数字串转换为符号串 aba,然后输出在屏幕上。
    (此处省略了关于编码长度的讨论。ascii 编码是定长编码,指每一个符号都对应一个两位的十六进制数)

有很多不同的编码。编码之间的差异,主要在于

  • 定义的符号数量
  • 相同符号对应的数字(假设定义了相同符号)
  • 符号对应数字(用二进制表示时)的长度

关于乱码

如果读取和写入时用的编码不同,就可能导致乱码。乱码只发生在读取时,它有两种定义,

  • 转换出的符号串,其整体或局部,对人而言是无意义的符号串
  • 转换出的符号串,和存储时(人确认过)的符号串不同

对人而言,看出乱码主要基于第一种定义,即基于假设,一个文本文件包含的符号串对人而言应当具有某种意义。由于意义是相对的,第二种定义在判断是否发生了乱码时更为准确。继续上面的例子

  • 假设有一个 iicsa 编码,它规定了一个符号和一个一位的十六进制数字之间的对应关系,例如 a <-> "1b <-> "2f <-> "6
  • 如果我们用 iicsa 编码解析前面例子中的数字串 "616261,得到的将是符号串 fafbfa,这就产生了乱码

解决乱码的一般步骤是

  1. 发现乱码时,不对该文件进行修改(特指不要保存)
  2. 猜测和了解文件储存时使用的编码(这一步最困难,因为有猜的成分[1]
  3. 用新编码读取该文件
  4. 如有需要,将文件另存为新编码

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..."

96d9b82509a6011e69e3ff77f5ef5d21.png

接着,在弹出的小窗口中,找到第 18 行的 GBK,点击选中这行,再按小窗口右下角的 "Reload With",让 texstudio 以 GBK 编码重新打开当前文件。

73f7480c2e6e73ab78e4350c2e7df257.png

这样,如果文件在以乱码形式打开后没有修改并保存过,且该文件确实是以 GBK 储存的,那么就能在 texstudio 里正常预览、修改储存和编译了。

第四步,如有需要,将文件另存为新编码

这一步可选。对 .tex 文件而言,我们推荐使用 UTF-8 编码。另存为新编码,也可以分为几步

  • 找一个软件,打开该文件并正常显示不乱码。这个软件可以是 texstudio,也可以是记事本、浏览器、其他编辑器等等。
  • 在不乱码的状态下,全选复制该文件中的所有内容。
  • 用 texstudio(也可以是其他软件)新建一个 UTF-8 编码的文件,把刚才复制的内容粘贴进去,确认显示无乱码,保存。
  • 重命名新文件、备份旧文件等后续事项。

结束。

补充

如果不需要另存为新编码,又经常需要使用 texstudio 打开非 UTF-8 编码的文档,还不想修改 texstudio 打开文件时默认使用的编码,可以在文档正常打开显示后,在 .tex 文件的首行插入 magic comment % !TeX encoding = GBK,引导编辑器总是以指定编码打开当前文档。这一步可以简化为下图中的操作。

3e6d593b86c3e30bf3e0d8c8f85d439a.png

关于 TeX 里的编码

  • TeX 内部还有一个带「编码」的概念,字体编码(font encoding)。本文不涉及字体编码。
  • 一个 LaTeX 项目加载的所有文本文件,最好使用相同编码。例如,一个加载了 .bib 文件的 main.tex 文件,.bib.tex 文件最好以相同的编码储存,否则可能出错。

参考

  1. ^例如这里的讨论 https://softwareengineering.stackexchange.com/q/187169
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值