改行コード
改行コードとは?
コンピュータは文字をすべて文字コードという数値で処理しますが、改行を表すのに用いられるコードが改行コードです。改行コードはOSによって次のように異なります。
OS | コード表記 | 16進表記 | 10進表記 | エスケープ表記 |
---|---|---|---|---|
Linux/Unix | LF | 0A | 10 | \n |
Windows | CR LF | 0D 0A | 13 10 | \r\n |
MacOS 9以前 | CR | 0D | 13 | \r |
MacOS X以降 | LF | 0A | 10 | \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
- デフォルトは自動モードです。[オプション]-[環境設定]-[転送]-[編集] でテキストモード、バイナリモード、自動モードの切り替えや、自動モード時にテキスト変換を行う拡張子を指定することができます。