CRLFとは?LFとの違いと改行コードのトラブル対処法
CRLFは改行を表す文字コードの組み合わせです。CR(キャリッジリターン)とLF(ラインフィード)の2文字で1つの改行を表します。
先に結論。WindowsはCRLF、Mac・LinuxはLFを使います。この違いがGitの警告・文字化け・プログラムの誤動作の原因になります。
CR・LF・CRLFの違い
| 名称 | 記号 | 16進数 | エスケープ | 主に使うOS |
|---|---|---|---|---|
| CR(Carriage Return) | 復帰 | 0x0D | \r | 旧Mac(Mac OS 9まで) |
| LF(Line Feed) | 改行 | 0x0A | \n | macOS・Linux・Unix |
| CRLF | 復帰+改行 | 0x0D 0x0A | \r\n | Windows |
名前の由来はタイプライターです。CRは印字位置を行の先頭に戻す動作、LFは紙を1行送る動作でした。この2つを合わせて「次の行の先頭へ移動する」を表していた名残が、いまも残っています。
なぜ問題になるのか
1.Gitで警告が出る
WindowsとMac・Linuxが混在するチームで最も多い問題です。
warning: LF will be replaced by CRLF in ファイル名.
The file will have its original line endings in your working directory
放置すると、中身は同じなのに全行が変更扱いになることがあります。diffが真っ赤になり、レビューができません。
対策は`core.autocrlf` の設定です。
# Windows の場合(チェックアウト時にCRLF、コミット時にLF)
git config --global core.autocrlf true
# Mac・Linux の場合(コミット時にCRLFをLFへ変換)
git config --global core.autocrlf input
さらに確実にするなら、リポジトリに .gitattributes を置きます。
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
Gitの基本操作はGit pushとは?使い方・基本コマンド・エラー対処法、インストールはGitインストール方法【Windows/Mac】にまとめています。
2.シェルスクリプトが動かない
WindowsでCRLFのまま保存した `.sh` ファイルをLinuxで実行すると、次のエラーが出ます。
bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
末尾の ^M がCRの正体です。Linuxは #!/bin/bash\r という名前のプログラムを探しに行って失敗しています。
修正はこれで済みます。
# dos2unix がある場合
dos2unix script.sh
# sed で消す
sed -i "s/\r$//" script.sh
3.CSVの読み込みでずれる
Excelが出力するCSVはCRLFです。Pythonで読むとき、改行の扱いを指定しないと空行が入ることがあります。
# 正しい書き方(newline="" を付ける)
import csv
with open("data.csv", newline="", encoding="utf-8") as f:
for row in csv.reader(f):
print(row)
`newline=””` を省略すると空行が混ざります。csvモジュールが自分で改行を処理するため、Python側で変換させないようにする指定です。
Pythonで改行コードを扱う
| やりたいこと | 書き方 |
|---|---|
| 改行で分割する | text.splitlines()(CR・LF・CRLFすべてに対応) |
| CRLFをLFに変換 | text.replace("\r\n", "\n") |
| CRだけ削除 | text.replace("\r", "") |
| 改行コードを調べる | ファイルをバイナリモード(rb)で開いて b"\r\n" を検索 |
| 書き込み時に固定する | open(path, "w", newline="\n") |
splitlines() はOSを問わず正しく分割してくれるので、改行コードが混在するデータを扱うときに便利です。詳しくはPython splitlines()とは?改行で文字列を分割する方法、改行を含む文字列の操作全般はPythonで改行を含む文字列を操作する方法にまとめています。
エディタでの確認と変更
| エディタ | 確認方法 |
|---|---|
| VS Code | 画面右下に「CRLF」「LF」と表示される。クリックで変更できる |
| サクラエディタ | ステータスバーに「CRLF」「LF」を表示 |
| Vim | :set ff? で確認、:set ff=unix でLFに変更 |
| メモ帳(Windows 10以降) | LFも扱えるが、保存時の挙動に注意 |
まず自分のエディタで今どちらになっているかを見てください。原因不明の不具合の多くは、これを見れば分かります。
よくある質問
CRLFとLF、どちらを使うべきですか?
迷ったらLFです。GitHubなどの共同開発ではLFが標準で、シェルスクリプトやDockerfileはLFでないと動きません。Windowsで開発する場合も `core.autocrlf` を設定すれば問題ありません。
^M という文字は何ですか?
CR(0x0D)の表示です。LinuxのエディタやターミナルでCRLFのファイルを開くと、LFは改行として処理され、残ったCRが `^M` として見えます。
Gitの警告は放置しても大丈夫ですか?
動作上は問題ないことが多いですが、diffが全行変更になってレビューできなくなるリスクがあります。`.gitattributes` を置いてチームで統一するのが確実です。
文字化けとは違うのですか?
別の問題です。文字化けは文字コード(UTF-8・Shift_JISなど)の不一致で起きます。Pythonの文字コードエラーはutf-8 codec can’t decode byteやcp932 codec can’t decode byteにまとめています。
関連記事
改行の扱いはsplitlines()と改行を含む文字列の操作、GitはGit pushの使い方をご覧ください。
テックジムは月額22,000円の通い放題でプログラミング教室を運営しています。東京本校(永田町)では毎週土曜にゼロから始めるPython入門講座、そしてゼロから始めるClaude Code講座を無料で開いています。どちらも説明会ではなく実際に手を動かす講座です。
まとめ
CRLFはWindowsが使う改行コードで、CR(0x0D)とLF(0x0A)の2文字です。macOS・LinuxはLFのみを使います。
- Gitの警告:`core.autocrlf` と `.gitattributes` で統一する
- シェルスクリプトが動かない:`^M` が原因。LFに変換する
- CSVに空行が入る:`open(…, newline=””)` を付ける
- 迷ったらLF:共同開発の標準はLF







