改行コードの変換 UNIX(LF) Windows(CR+LF) MacOS(CR)

改行コードってOSによって違うんですね。ちょっとまとめてみました。

スポンサーリンク

改行コードの違い UNIX(LF) Windows(CR+LF) MacOS(CR)

text

プログラムを書いていると必ず出くわす問題の1つにOSによる改行コードの違いがあると思います。

OSによる改行コードは以下の通りです。

記号 読み方 ASCII マッチング オペレーティングシステム
CR キャッリッジリターン
(Carriage Return)
0x0D \r MacOS(バージョン9まで)
LF ラインフィード
(Line Feed)
0x0A \n UNIX, Linux, AIX, Mac OS X
CR+LF キャリッジリターン・ラインフィード 0x0D0A \r\n MS-DOS, Windows, OS/2

これらのOSによる改行コードの違いは、歴史的にはかなり古く、そのOSの起源というか、源流に依存しているようです。

例えば、UNIXにおいては、UNIX以前のオペレーティングシステムであるMulticsが改行コードとしてLFを採用していたことと関係があるようです。

UNIXはMulticsを元に作られています。

Windowsにおいては、MS-DOSやそれ以前のオペレーティングシステムであるCP/Mにおいて改行コードがCR+LFであったことと関係しています。

Windowsの源流はMS-DOSだし、MS-DOSはCP/Mと一部競合していた時代があったのでCP/Mを参考にしていたはずです。

ところで、プログラムを書いていると時々これらの処理系による改行コードのを意識しないといけない場面がよくあります。

これらのコードの変換方法を見てみましょう。

Windowsでの改行コードの変換 LF→CR+LF

私の場合、Windows環境での改行コードの変換は基本的にサクラエディタを使って行っています。
image

サクラエディタでは改行コードのCR+LF、LF、CRの相互変換がメニューから簡単に行うことが可能です。

また、文字コードのSJIS、JIS、EUC-JP、Latin 1、Unicode、UnicodeBE、UTF-8、CESU-8、UTF-7の変換も行えるほか、BOMのありなしの変換も行うことが可能です。

BOMについては以下をご覧ください。

BOM(バイトオーダーマーク, byte order mark, ボム)ではまった話
今回はBOM(バイトオーダーマーク, byte order mark, ボム)の話です。 BOM(バイトオーダーマーク, byte ord...

Windows環境では、エディタやその他便利な改行コード変換ツールがたくさんあるようです。

Linuxでの改行コードの変換 LF→CR+LF

Linuxではperlを使ってコマンドラインから改行コードの変換を行うことが可能です。

リダイレクトを使っています。

標準出力と標準エラー出力を同時に(または別ファイルに)リダイレクトする方法
標準ストリーム(Standard Streams) 標準ストリームとは、UnixやWindowsのコマンドプロンプトにおいて、プログラムと...

LFからCR+LFへの変換は以下の通りです。

CR+LFからLFへの変換は以下の通りです。

od -x <ファイル名> などのコマンドによって、ファイルの中身のASCIIコードを見ることが可能です。

CR+LFのシェルスクリプトをLinuxで実行する

中身がこんなファイルwindows.shの改行コードをCR+LFで作ったとします。

このファイルをLinuxで実行すると以下のようになります。

$ sh windows.sh
windows.sh: 行 2: $'\r': コマンドが見つかりません

シェルスクリプトの改行コードは、必ずLFにする必要があります。

逆に、「LFのバッチファイルをWindowsで実行する」と実行できるようです。

プログラムでの改行コードの扱いなど

プログラムでは以下のように記述すればコンパイラが処理系に応じた改行コードに変換してくれます。

C言語の場合は、printf(“\n”);

Javaの場合は、System.out.println

C#の場合は、System.Environment.NewLine

をそれぞれ使えば処理系に応じた改行コードを使うようになります。

単純にWindowsだけの世界でプログラムを行っている人はあまり改行コードを意識することはないようです。

ただ、サーバー系のプログラムだったり、WindowsとLinuxの両方を扱うようなプログラムでは改行コードの違いは注意が必要です。

ところで、最近はスマホのアプリを描く人も多いと思いますが、さて、AndroidやiPhoneでの改行コードはどうなっているのでしょうか?

AndroidはもろにLinuxカーネルのカスタマイズだし、iOSもUNIXを源流に持つOSなのでどちらも改行コードはLFなのでしょうか。
時間ができた時に調べてみます。

または誰か教えてください。

スポンサーリンク
スポンサーリンク

コメント

  1. 匿名 より:

    JavaではSystem.out.println()以外にもシステムプロパティを使うという手があり、よく使われています。

Translate »