编码与换行

.tex 文件归根结底是字节序列,引擎必须用正确的 字符编码 读取,才能正确解释。换行符 也会影响编辑和差异比较。日文历史上并存过多种编码,因此这里很容易出错。先说结论:现在应统一为 UTF-8 + LF。本页介绍各种编码、换行符,以及转换工具 nkf

字符编码 — 现在用 UTF-8

字符编码是字节与字符之间的映射规则。日文历史上使用过 Shift_JIS(旧 Windows)、EUC-JP(旧 Unix)和 ISO-2022-JP(邮件中的 “JIS code”);现在 Unicode 的 UTF-8 是通用标准。较新的 TeX Live 和 LaTeX 默认使用 UTF-8,因此把 .tex 保存为 UTF-8 可以避免大多数字符乱码。编码不一致时,就会出现典型的 乱码

编码主要使用场景
UTF-8当前标准(Unicode);新项目唯一推荐
Shift_JIS旧 Windows 环境
EUC-JP旧 Unix 环境
ISO-2022-JP邮件、“JIS code”

对于 (u)pLaTeX,可以用 -kanji=utf8 显式指定输入编码(见“编译命令”)。

换行符 — LF / CRLF / CR

行末包含不可见的控制字节:LF\n,Unix/macOS)、CRLF\r\n,Windows)、CR\r,旧 Mac)。LaTeX 本身大多都能接受,但同一文件或团队中 换行混用 会让 diff 变乱,并可能让某些工具出问题。建议统一为 LF,并在 Git 中用 .gitattributes 规范化。

terminal
# .gitattributes — 改行を正規化 / normalize newlines
*.tex text eol=lf

用 nkf 转换

nkf(Network Kanji Filter)检测和转换 日文编码与换行符的标准工具。先用 nkf -g file 查看当前编码;再用 -w 转为 UTF-8,用 -s 转为 Shift_JIS,用 -e 转为 EUC-JP,用 -j 转为 ISO-2022-JP。换行使用 -Lu/-Lw/-Lm--overwrite 可直接覆盖原文件。

选项作用
-g检测当前编码和换行(不转换)
-w转换为 UTF-8(无 BOM)
-s / -e / -j转换为 Shift_JIS / EUC-JP / ISO-2022-JP
-Lu / -Lw / -Lm将换行转换为 LF / CRLF / CR
--overwrite直接覆盖输入文件
terminal
nkf -g old.tex                      # 文字コードを判定 / detect the encoding
nkf -w -Lu --overwrite old.tex      # UTF-8 + LF に変換して上書き / to UTF-8 + LF, in place
  • 无论新旧,都统一为 UTF-8 + LF
  • 旧 Shift_JIS/EUC 源文件可用 nkf -w -Lu --overwrite *.tex 批量转换。
  • 需要确保 (u)pLaTeX 读取 UTF-8 时,使用 -kanji=utf8
  • 在 Git 中通过 .gitattributes 规范化换行;不确定时用 nkf -g 检查。