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
2026年9月24日時点

名前の由来はタイプライターです。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")
2026年9月24日時点

splitlines() はOSを問わず正しく分割してくれるので、改行コードが混在するデータを扱うときに便利です。詳しくはPython splitlines()とは?改行で文字列を分割する方法、改行を含む文字列の操作全般はPythonで改行を含む文字列を操作する方法にまとめています。

エディタでの確認と変更

エディタ 確認方法
VS Code 画面右下に「CRLF」「LF」と表示される。クリックで変更できる
サクラエディタ ステータスバーに「CRLF」「LF」を表示
Vim :set ff? で確認、:set ff=unix でLFに変更
メモ帳(Windows 10以降) LFも扱えるが、保存時の挙動に注意
2026年9月24日時点

まず自分のエディタで今どちらになっているかを見てください。原因不明の不具合の多くは、これを見れば分かります。

よくある質問

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

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら