改行コードとは
改行コードとは、ワープロや
コンピュータでテキストの段落を区切るために使用される
制御文字です。主にキャリッジリターン(CR)とラインフィード(LF)の2種類があり、システムによって使い分けられています。これらの用語は
タイプライターの動作に由来しており、CRは印字位置を先頭に戻し、LFは次の行へ送る役割を果たします。
改行コードの種類
改行コードは、システムによって異なる扱いを受けるため、データ交換の際に問題が生じることがあります。
LF(ラインフィード): UNIX系システム(Linux, macOSなど)で主に利用されます。文字コードは0x0Aです。
CR+LF: Windows系システムで利用されます。CR(0x0D)とLF(0x0A)の組み合わせです。
CR(キャリッジリターン): 古いMac OSなどで利用されていました。文字コードは0x0Dです。
その他のコード:
Unicodeには、NEL(0x85)、LS(0x2028)、PS(0x2029)などの改行に関わる
制御文字も存在します。また、
IBMの
メインフレームシステムでは、NELが使用されます。
改行コードの歴史
改行コードは、
タイプライターや
テレタイプ端末の仕組みが起源です。初期のシステムでは、プリンターヘッドを次の行の先頭に移動させるために、CRとLFを別々に送る必要がありました。このため、例えば行の途中でLFを伴わないCRを送り、そのまま文字を出力することで、文字を重ね書きするなどの操作が可能でした。
ASCIIコード策定時、ISOの草案ではCR+LFとLFの両方をサポートしていましたが、ASAの草案ではCR+LFのみがサポートされていました。MulticsオペレーティングシステムはLFを改行コードとして採用し、
UNIXやそれらに続くシステムもそれに倣いました。
MS-DOSやWindowsは、
CP/M|CP_Mの実装を真似てCR+LFを採用しています。
プログラミングにおける改行コード
プログラミング言語は、異なるOSの改行コードを吸収するために、抽象化の仕組みを提供しています。
C言語では、
(改行)と\r(復帰)の
エスケープシーケンスを提供しており、コンパイラがそれぞれの環境に適したバイト列に変換します。
ただし、I/Oライブラリでは、テキストモードでファイルを開いた場合、
が自動的にシステムの改行コードに変換されます。例えば、
UNIXでは0x0A、Windowsでは0x0D 0x0Aになります。バイナリモードで開いた場合は、変換は行われません。このため、ネットワークプログラミングなどでは、注意が必要です。
Javaでも、
(改行)と\r(復帰)の
エスケープシーケンスが提供されており、それぞれ0x000A、0x000Dに変換されます。しかし、PrintStreamクラスのprint/printlnメソッドでは、これらの数値を特別扱いせず、環境依存の改行コードに変換しません。環境依存の改行コードを出力する場合は、printfメソッドの%nを使用する必要があります。
インターネットにおける改行コード
HTTP, SMTP, FTPなどのインターネットプロトコルでは、改行コードとしてCR+LFが推奨されていますが、実際にはLFにも対応することが求められています。これは、初期のインターネットサーバーがDEC機によって構成されていた名残です。
まとめ
改行コードは、テキストデータを扱う上で重要な要素です。異なるシステム間でデータ交換を行う際には、改行コードの違いによる不整合が発生しないように、注意する必要があります。プログラミングでは、言語やライブラリの提供する機能を使って、OSの違いを吸収したり、必要に応じてバイナリモードで直接改行コードを制御したりすることが重要になります。
関連項目
文字コード
ASCII
行 (コンピュータ)
キャリッジ・リターン
外部リンク
*
Unicode.html'>The End-of-Line Story