文字コードと改行

.tex ファイルは結局バイト列で、エンジンは正しい 文字コード(エンコーディング) で読まなければ正しく解釈できません。さらに 改行コード も、編集や差分に影響します。日本語では歴史的に複数のエンコーディングが併存したぶん、ここがつまずきやすい所。結論を先に言えば、今は UTF-8 + LF に統一するのが正解です。このページでは各エンコーディングと改行、そして変換ツール nkf を扱います。

文字コード — 今は UTF-8

文字コードは、バイトと文字の対応規則です。日本語では歴史的に Shift_JIS(旧 Windows)、EUC-JP(旧 Unix)、ISO-2022-JP(メールの「JIS コード」)が使われ、現在は Unicode の UTF-8 が universal な標準です。最近の TeX Live と LaTeX は 既定で UTF-8。だから .texUTF-8 で保存 しておけば、ほとんどの文字化けトラブルを避けられます。エンコーディングが食い違うと、いわゆる 文字化け が起きます。

文字コード主に使われた場面
UTF-8現在の標準(Unicode)。新規はこれ一択
Shift_JIS旧 Windows 環境
EUC-JP旧 Unix 環境
ISO-2022-JPメール・「JIS コード」

なお (u)pLaTeX で入力エンコーディングを明示したいときは -kanji=utf8 を付けます(詳しくは「コンパイルコマンド」)。

改行コード — LF / CRLF / CR

行末には目に見えない制御文字が入ります——LF\n、Unix・macOS)、CRLF\r\n、Windows)、CR\r、古い Mac)。LaTeX 本体はどれも概ね許容しますが、1 つのファイルやチーム内で 改行が混在 すると、差分が汚くなったり一部のツールで不具合が出たりします。LF に統一 し、Git では .gitattributes で正規化するのがおすすめです。

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

nkf で変換する

nkf(Network Kanji Filter) は、日本語のエンコーディングと改行を 判定・変換 する定番ツールです。まず nkf -g ファイル で現在のコードを調べ、-w で UTF-8、-s で Shift_JIS、-e で EUC-JP、-j で ISO-2022-JP に変換します。改行は -Lu-Lw-Lm--overwrite でファイルを直接書き換えられます。

オプション働き
-g現在のエンコーディングと改行を判定(変換しない)
-wUTF-8(BOM なし)に変換
-s / -e / -jShift_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 で判定。