ぱんだツールズぱんだツールズ

文字コード・エンコーディング

CRLFをLFに変換する方法 — 改行コードをWindows/Mac/Linux形式に一発変換

約5分

Gitで git diff を見たら1行も変えていないのに全行が差分として表示された、あるいはWindowsで作ったスクリプトを Macで動かしたら行末に ^Mが出てエラーになった——こうした「あるある」の正体が、CRLFとLFという改行コードの違いです。 この記事では、CRLFとLFの違いから、変換が必要になる典型ケース、ブラウザツール・VSCode・コマンドラインでの 変換手順までを実務目線で解説します。

CRLFとLFの違い

改行コードは「ここで行が変わる」ことを表す制御文字です。ところがこの表現方法がOSによって異なり、 主に CRLFLF の2種類が使われています。 CR(Carriage Return、復帰)とLF(Line Feed、改行)はもともとタイプライターの動作に由来し、 CRが「行頭に戻る」、LFが「次の行へ送る」操作を表していました。

改行コードバイト表現(16進)標準とするOS・環境由来
CRLF0D 0A(2バイト)Windows・MS-DOS・一部のネットワーク規格タイプライターの「復帰+改行」をそのまま継承
LF0A(1バイト)macOS・Linux・Unix・Web全般Unixが改行をLF1文字に簡略化
CR0D(1バイト)Mac OS 9以前(クラシックMac)現在はほぼ使われない

現在は LFが事実上の標準です。macOS(Mac OS X以降)はUnix系なのでLFを採用しており、 HTTP・JSON・各種プログラミング言語のソースもLFが前提です。Windowsだけが歴史的経緯でCRLFを使い続けているため、 WindowsとMac/Linuxをまたいでファイルをやり取りすると改行コードの差が顕在化します。

変換が必要になる典型ケース

改行コードの違いは普段は気づきませんが、次のような場面でトラブルとして表面化します。

1. Gitの差分が全行になる・コンフリクトする

WindowsとMacのメンバーが同じリポジトリで作業すると、改行コードがCRLFとLFで食い違い、 中身は同じなのに「全行が変更された」と表示されます。レビューが困難になり、無意味なコンフリクトも増えます。 後述の .gitattributes で改行コードを固定するのが根本対策です。

2. シェルスクリプトが「^M」でエラーになる

WindowsでCRLF保存したシェルスクリプトをMac/Linuxで実行すると、各行末に残ったCRが原因でbad interpretercommand not found が発生します。 スクリプトをLFに変換すれば解決します。

3. ExcelのCSVで行が崩れる

セル内改行や改行コードの不一致があると、CSVを開いたときに1行が複数行に分かれたり、 逆に複数行が1行にまとまったりします。改行コードを揃えると行崩れを防げます。

4. サーバー送信・API連携でデータが壊れる

HTTPヘッダやメール(SMTP)は規格上CRLFを要求しますが、本文データはLF前提のことが多く、 混在すると意図しない空行や解析エラーが起きます。連携先の仕様に改行コードを合わせる必要があります。

ブラウザツールで改行コードを変換する(最も手軽)

インストール不要で一番手軽なのが、ぱんだツールズのブラウザツールを使う方法です。 ファイルはサーバーに送信されず、すべてブラウザ内で処理が完結するため、機密ファイルでも安心です。

  1. 改行コード変換ツールを開く改行コード変換ツールにテキストファイルをドロップするか、変換したいテキストを貼り付けます。
  2. 変換先の改行コードを選ぶ:LF(Mac/Linux)・CRLF(Windows)・CR から目的の形式を選択します。
  3. 変換結果を取得する:変換後のテキストをコピーするか、ファイルとしてダウンロードします。

ヒント

改行コードと一緒に文字コードも気になる場合は、先に文字コード確認ツールで現在の文字コードを判定し、必要ならテキスト文字コード変換ツールでUTF-8などに揃えておくと、文字化けと改行ズレをまとめて解消できます。

VSCodeで改行コードを変換する

VSCode(Visual Studio Code)なら、エディタ画面のなかで改行コードをワンクリックで切り替えられます。 無料でWindows・macOS・Linuxに対応しています。

  1. 変換したいファイルをVSCodeで開く
  2. 画面右下のステータスバーにある EOLインジケータ(「CRLF」または「LF」と表示されている部分)をクリック
  3. 表示されたメニューから「LF」または「CRLF」を選ぶ
  4. ファイルを上書き保存する(保存して初めて変換が反映される)

プロジェクト全体で改行コードを統一したい場合は、設定(settings.json)に"files.eol": "\n"を追加すると、新規ファイルがLFで作られるようになります。

コマンドラインで改行コードを変換する

ターミナルでまとめて変換したい場合は、次のコマンドが定番です。状況に応じて使い分けてください。 以下はいずれもCRLFをLFに変換する例です。

dos2unix(最も確実)

改行コード変換専用のコマンドで、迷ったらこれが安全です。

# CRLF → LF(Windows形式 → Mac/Linux形式)
dos2unix input.txt

# LF → CRLF(Mac/Linux形式 → Windows形式)
unix2dos input.txt

sed

多くの環境に標準で入っています。行末のCR(\r)を削除します。

# CRLF → LF(行末のCRを削除)
sed -i 's/\r$//' input.txt

tr

CR文字そのものを削除します。シンプルですがファイル中のすべてのCRを消す点に注意してください。

# CRLF → LF(CRをすべて削除)
tr -d '\r' < input.txt > output.txt

nkf(文字コードも同時に変換)

日本語の文字コード変換でおなじみのnkfは、改行コードの変換にも対応しています。-Lu でLF、-Lw でCRLFを指定します。

# CRLF → LF かつ UTF-8 へ変換して上書き
nkf -w -Lu --overwrite input.txt

.gitattributesで自動変換する(開発者向け)

チーム開発では、各自のエディタ設定や core.autocrlfに頼るより、リポジトリのルートに .gitattributesを置いて改行コードを固定するのが確実です。これにより、OSやエディタが違っても リポジトリ内の改行コードが揃い、無意味な差分やコンフリクトを防げます。

# すべてのテキストを自動判定し、リポジトリ内はLFに統一
* text=auto eol=lf

# Windows用のバッチ・PowerShellスクリプトはCRLFを維持
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf

# バイナリファイルは改行変換しない
*.png binary
*.jpg binary
*.pdf binary

.gitattributes を追加・変更した後は、 既存ファイルへ反映させるために git add --renormalize .を実行してコミットします。バイナリファイルに binaryを明示しておくと、画像やPDFが改行変換で壊れる事故を防げます。

まとめ

  • CRLF(0D 0A・Windows)とLF(0A・Mac/Linux/Web)はバイト数が違う別の改行コード
  • 現代の標準はLF。WindowsとMac/LinuxをまたぐとGitの差分・「^M」・行崩れの原因になる
  • 最も手軽な変換は改行コード変換ツール(インストール不要・サーバー送信なし)
  • VSCodeなら右下のEOLインジケータをクリックしてLF/CRLFを切り替え、保存で反映
  • コマンドラインでは dos2unix・sed・tr・nkf が定番。nkfは文字コードも同時に変換できる
  • チーム開発では .gitattributes で改行コードを固定し、バイナリは変換対象から除外する
  • 文字コードが気になるときは文字コード確認ツールで判定できる

よくある質問

CRLFとLFはどう違うのですか?

どちらも「改行」を表す制御文字ですが、使うバイト数が違います。CRLFはCR(キャリッジリターン、16進で 0D)とLF(ラインフィード、16進で 0A)の2バイトを連続させたもので、Windowsの標準です。LFはLFの1バイト(0A)だけで、Mac(macOS)・Linux・UnixとほとんどのWeb技術の標準です。見た目はどちらも改行されるため画面では区別がつきませんが、バイナリレベルでは別物で、この違いがGitの差分や文字化けの原因になります。

macOSのターミナルやエディタで「^M」が表示されるのはなぜですか?

「^M」はCR(0D)を表す記号で、CRLF形式のファイルをLF前提の環境(macOS・Linux)で開いたときに、行末に残ったCRが可視化されたものです。たとえばWindowsで作ったシェルスクリプトをmacOSで実行すると、各行末に余分なCRが付いているため「command not found」のような不可解なエラーが出ます。改行コードをLFに変換すればCRが取り除かれ、「^M」も消えます。VSCodeなら右下のEOL表示を「LF」に切り替えて保存するのが手軽です。

Gitで改行コードが自動変換される「autocrlf」設定の意味を教えてください。

`core.autocrlf` はGitがチェックアウト・コミット時に改行コードを自動変換する設定です。Windowsで `git config --global core.autocrlf true` にすると、リポジトリ内はLFで保ち、チェックアウト時にCRLF・コミット時にLFへ自動変換します。macOS/Linuxでは `input`(コミット時のみCRLF→LFに変換)が推奨です。ただし自動変換は意図しない差分を生むことがあるため、チーム開発では後述の `.gitattributes` で改行コードを明示的に固定するほうが確実です。

HTMLファイルで改行コードは関係しますか?

HTMLの表示結果には基本的に影響しません。ブラウザはCRLFでもLFでも改行を空白として同じように扱い、改行を見た目に反映するには `<br>` タグや `white-space: pre` のCSSが必要だからです。ただしソースファイル自体の改行コードはバージョン管理の差分や、テンプレートエンジン・ビルドツールの挙動に影響します。Web標準ではLFが推奨されているため、HTML・CSS・JavaScriptのソースはLFで統一しておくのが無難です。

PythonやNode.jsで改行コードを指定する方法はありますか?

あります。Pythonでは `open()` の `newline` 引数を使い、`open("out.txt", "w", newline="\n")` でLF、`newline="\r\n"` でCRLFを指定できます。読み込み時に `newline=""` を指定すると改行を変換せず原文のまま扱えます。Node.jsでは文字列を書き出す際に明示的に改行文字を選び、`text.replace(/\r\n/g, "\n")` でCRLFをLFへ、`text.replace(/\n/g, "\r\n")` でLFをCRLFへ変換できます。os.EOL を使うと実行環境のOSに合わせた改行になります。

テキストファイルとバイナリファイルで改行コードの扱いが違うのはなぜですか?

テキストファイルの改行は「行の区切り」という意味を持つデータですが、バイナリファイル(画像・実行ファイル・PDFなど)の中の 0D や 0A は改行ではなく単なる数値データです。バイナリファイルに改行変換をかけると、画素値やヘッダの一部が書き換わってファイルが壊れます。そのためGitの `.gitattributes` でも `*.png binary` のように指定して、バイナリには改行変換を一切かけない設定が推奨されます。改行変換はテキストファイルだけに行うのが鉄則です。

Windowsのメモ帳で保存するとCRLFになりますか?

従来のメモ帳は改行をCRLFで保存していました。現在のメモ帳(Windows 11以降)は「編集 → 改行入力」やステータスバーから改行コードを選べるようになり、LFでの保存にも対応しています。ただし古い環境やデフォルト設定ではCRLFになりがちなので、LFで保存したい場合はVSCodeなど改行コードを明示できるエディタを使うか、ぱんだツールズの改行コード変換ツールでまとめてLFに変換するのが確実です。

アップロードしたファイルはサーバーに送信されますか?

いいえ。ぱんだツールズの改行コード変換ツール・文字コード確認ツール・テキスト文字コード変換ツールは、すべてブラウザ内(JavaScript)で処理が完結します。入力したテキストやファイルはサーバーに一切送信されず、お使いの端末の中だけで変換が行われます。ソースコードや業務データなど社外に出せない機密ファイルでも安心して改行コードを変換できます。

この記事で紹介したツール