Encodage et fins de ligne

Un fichier .tex est au final une suite d’octets, et le moteur doit les lire avec le bon encodage de caractères pour les interpréter correctement. Les codes de fin de ligne comptent aussi pour l’édition et les diffs. Le japonais a historiquement jonglé avec plusieurs encodages, ce qui provoque souvent des problèmes. La réponse courte : aujourd’hui, standardisez sur UTF-8 + LF. Cette page couvre les encodages, les fins de ligne et l’outil de conversion nkf.

Encodages — UTF-8 aujourd’hui

Un encodage de caractères est la règle qui associe octets et caractères. Le japonais a historiquement utilisé Shift_JIS (anciens Windows), EUC-JP (anciens Unix) et ISO-2022-JP (le « JIS code » du courrier électronique) ; aujourd’hui, UTF-8 d’Unicode est le standard universel. Les TeX Live et LaTeX récents sont en UTF-8 par défaut, donc enregistrer votre .tex en UTF-8 évite la plupart des corruptions. Une discordance d’encodage produit le texte illisible classique (*mojibake*).

EncodageUsage principal
UTF-8Standard actuel (Unicode) ; seul choix pour les nouveaux travaux
Shift_JISAnciens environnements Windows
EUC-JPAnciens environnements Unix
ISO-2022-JPCourriel, « JIS code »

Avec (u)pLaTeX, vous pouvez indiquer explicitement l’encodage d’entrée avec -kanji=utf8 (voir « Commandes de compilation »).

Fins de ligne — LF / CRLF / CR

Les lignes se terminent par des octets de contrôle invisibles : LF (\n, Unix/macOS), CRLF (\r\n, Windows) et CR (\r, ancien Mac). LaTeX les tolère généralement tous, mais les fins de ligne mélangées dans un fichier ou une équipe rendent les diffs confus et perturbent certains outils. Standardisez sur LF et normalisez avec .gitattributes dans Git.

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

Convertir avec nkf

nkf (Network Kanji Filter) est l’outil standard pour détecter et convertir les encodages japonais et fins de ligne. Inspectez d’abord avec nkf -g file, puis convertissez en UTF-8 avec -w, Shift_JIS avec -s, EUC-JP avec -e ou ISO-2022-JP avec -j. Les fins de ligne utilisent -Lu/-Lw/-Lm, et --overwrite réécrit le fichier en place.

OptionEffet
-gDétecter l’encodage et la fin de ligne actuels (sans conversion)
-wConvertir en UTF-8 (sans BOM)
-s / -e / -jConvertir en Shift_JIS / EUC-JP / ISO-2022-JP
-Lu / -Lw / -LmConvertir les fins de ligne en LF / CRLF / CR
--overwriteÉcraser le fichier d’entrée en place
terminal
nkf -g old.tex                      # 文字コードを判定 / detect the encoding
nkf -w -Lu --overwrite old.tex      # UTF-8 + LF に変換して上書き / to UTF-8 + LF, in place
  • Standardiser tout, ancien comme nouveau, en UTF-8 + LF.
  • Convertir en lot les anciennes sources Shift_JIS/EUC avec nkf -w -Lu --overwrite *.tex.
  • Forcer l’entrée UTF-8 pour (u)pLaTeX avec -kanji=utf8 si nécessaire.
  • Normaliser les fins de ligne avec .gitattributes sous Git ; vérifier avec nkf -g en cas de doute.