.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。だから .tex を UTF-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 で正規化するのがおすすめです。
# .gitattributes — 改行を正規化 / normalize newlines
*.tex text eol=lfnkf で変換する
nkf(Network Kanji Filter) は、日本語のエンコーディングと改行を 判定・変換 する定番ツールです。まず nkf -g ファイル で現在のコードを調べ、-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 | 引数のファイルを直接上書き |
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で判定。