改行コード

目次

改行コードとは?

コンピュータは文字をすべて文字コードという数値で処理しますが、改行を表すのに用いられるコードが改行コードです。改行コードはOSによって次のように異なります。

OSコード表記16進表記10進表記エスケープ表記
Linux/UnixLF0A10\n
WindowsCR LF0D 0A13 10\r\n
MacOS 9以前CR0D13\r
MacOS X以降LF0A10\n

CR や LF は下記の意味を持ちます。

CR (Carriage Return)
キャリッジリターンの略で「復帰コード」とも呼ばれます。改行というよりはカーソルをその行の先頭に戻す意味合いが強いコードです。
LF (Line Feed)
ラインフィードの略で「(狭義の)改行コード」と呼ばれます。カーソルの横方向位置はそのままで1行下に移動する(タイプライターの用紙を1行分上にずらす)意味合いが強いコードです。

Linux/Unix 系では LF のみ、MacOS 9以前では CR のみで改行(1行下の先頭)を表すのに対し、Windows 系では行の先頭に移動して1行下に移動するという意味で CR LF を(広義の)改行コードとしています。

改行コードを調べる

Windowsの場合

メモ帳(notepad.exe)でテキストファイルを開くと右下に [Windows(CRLF)]、[Unix(LF)] などと表示されます。VSCode など他のエディタでも画面の右下や [名前をつけて保存] の際に表示されることが多いようです。

Linux/Unixの場合

file コマンドで確認することができます。Unix(LF) であれば改行コード情報は表示されず、Windows(CR LF) であればその旨が表示されます。

$ file linux.txt
linux.txt: UTF-8 Unicode text
$ file win.txt
win.txt: UTF-8 Unicode text, with CRLF line terminators

od コマンドで調べることもできます。0d 0a があれば Windows(CR LF)、0a のみであれば Unix(LF) です。

$ od -tx1z win.txt
0000000 41 41 41 0d 0a 42 42 42 0d 0a                    >AAA..BBB..<
0000012

hexdump コマンドで調べることもできます。\r \n であれば Windows(CR LF)、\n のみであれば Unix(LF) です。

$ hexdump -c win.txt
0000000   A   A   A  \r  \n   B   B   B  \r  \n
000000a

cat コマンドの -e オプションで調べることもできます。^M$ と表示されれば Windows(CR LF)、$ のみであれば Unix(LF) です。

$ cat -e linux.txt
AAA$
BBB$
$ cat -e win.txt
AAA^M$
BBB^M$

MacOS X以降の場合

基本的に Linux/Unix の場合と同様です。ターミナルから file や od コマンドを使用して調べます。

改行コードを変換する

Windowsの場合

テキストエディタの改行コード変換機能を利用します。

メモ帳(notepad.exe)
表示する機能はありますが変換する機能は無いようです。
VSCode
右下に表示されている改行コード(CRLF または LF)をクリックすると改行コードを指定することができます。変更して保存。
サクラエディタ
[ファイル]-[名前を付けて保存] で改行コードを指定して保存。
Mery
[ファイル]-[名前を付けて保存] で改行コードを指定して保存。

Linux/Unixの場合

sed コマンドを使用します。

# CR LF を LF に変換
$ sed 's/\r//' win.txt > linux.txt
# LF を CR LF に変換
$ sed 's/$/\r/' linux.txt > win.txt

MacOS X以降の場合

基本的に Linux/Unix の場合と同様です。ターミナルから sed コマンドを使用して変換します。

CGI設置時の注意

HTMLファイルであれば、どの改行コードであってもブラウザが適切に処理してくれますが、CGIスクリプトはOSに適した改行コードでなければエラーになってしまいます。Web サーバーは Linux/Unix 系が使用されていることが多く、Windows(CR LS) の改行コードを Unix(LF) に変換してやる必要があります。多くの FTP クライアントソフトは CGI 転送時に改行コードを自動変換する機能を備えています。

テキストモードとバイナリモード

FTPクライアントソフトにおいて、改行コードを変換するモードと変換しないモードがあります。

バイナリモード
改行コード変換を行いません。テキストファイルも画像ファイルもそのまま転送します。
テキストモード(ASCIIモード)
サーバー側の改行コードに合わせて改行コードを変換します。CGI ファイルを Windows から Linux/Unix 系サーバーにアップロードする際は改行コードを変換する必要があります。画像ファイルに対してテキストモードで転送してしまうと画像データの一部が壊れてしまうことがあります。
自動モード
ファイルの拡張子によってバイナリモードとテキストモードを自動的に切り替えます。例えば *.cgi と *.pl はテキストモードで、その他のファイルはバイナリモードで転送したりします。対象とする拡張子は FTP クライアントソフトによって異なります。

FTPクライアントソフトの設定

FFFTP v5.8
デフォルトは自動モードです。ツールバーの [A (アスキー転送モード)]、[B (バイナリ転送モード)]、[AB (ファイル名で転送モード切替)] で切り替えることができます。[オプション]-[環境設定]-[転送1] でどの拡張子のファイルをテキストモード(アスキーモード)で転送するかを指定できます。
WinSCP v6.3
デフォルトは自動モードです。[オプション]-[環境設定]-[転送]-[編集] でテキストモード、バイナリモード、自動モードの切り替えや、自動モード時にテキスト変換を行う拡張子を指定することができます。