改行コードの種類
テキストファイルの改行は、実際にはOSに応じた制御文字で表現されます。
- LF(\n):Line Feed。Unix・Linux・macOS(OS X以降)・現代のWeb標準
- CRLF(\r\n):Carriage Return + Line Feed。Windows・HTTPヘッダー・古いプロトコル
- CR(\r):Carriage Returnのみ。古いMac OS(OS 9以前)。現在はほぼ使われない
なぜ問題になるのか
WindowsとMac・Linuxが混在する開発環境では、改行コードの違いがトラブルの原因になります。Gitの差分表示でCRLFが原因の変更が大量に出たり、シェルスクリプトがWindowsで編集されてCRLFになりUnixで実行エラーが出たりするケースが典型的です。
Gitでの改行コード設定
# Windowsでチェックアウト時にCRLFに変換、コミット時にLFに変換
git config --global core.autocrlf true
# Mac/Linuxでコミット時にLFに変換(チェックアウト時は変換しない)
git config --global core.autocrlf input
# 変換しない
git config --global core.autocrlf false
チームで統一するには.gitattributesファイルで設定を強制するのが確実です。
プログラムでの変換
# Python: CRLFをLFに変換
text = text.replace('\r\n', '\n').replace('\r', '\n')
# JavaScript
const normalized = text.replace(/\r\n|\r/g, '\n')