改行コードって、UNIX (Linux)、Windows、Macでは、OSによって違うんですね。
これがまた綺麗に異なるんだな。
ちょっとまとめてみました。
目次
改行コードの違い UNIX Linux (LF) Windows (CR LF) Mac (CR)
プログラムを書いていると必ず出くわす問題の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環境での改行コードの変換は基本的にサクラエディタを使って行っています。
サクラエディタでは改行コードのCR+LF、LF、CRの相互変換がメニューから簡単に行うことが可能です。
また、文字コードのSJIS、JIS、EUC-JP、Latin 1、Unicode、UnicodeBE、UTF-8、CESU-8、UTF-7の変換も行えるほか、BOMのありなしの変換も行うことが可能です。
BOMについては以下をご覧ください。
Windows環境では、エディタやその他便利な改行コード変換ツールがたくさんあるようです。
Linuxでの改行コードの変換 LF→CR+LF
Linuxではperlを使ってコマンドラインから改行コードの変換を行うことが可能です。
リダイレクトを使っています。
リダイレクトについては以下をご覧ください。
LFからCR+LFへの変換は以下の通りです。
1 |
$ perl -p -e 's/\n/\r\n/' < linux.txt > windows.txt |
CR+LFからLFへの変換は以下の通りです。
1 |
$ perl -p -e 's/\r\n/\n/' < windows.txt > linux.txt |
UNIXやLinuxでは、
od -x <ファイル名>
などのコマンドによって、ファイルの中身のASCIIコードを見ることが可能です。
CR+LFのシェルスクリプトをLinuxで実行する
中身がこんなファイルwindows.shの改行コードをCR+LFで作ったとします。
1 2 3 |
#!/bin/sh echo hello |
このファイルを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 iOSの改行コードは?
ところで、最近はスマホのアプリを描く人も多いと思いますが、さて、AndroidやiPhoneでの改行コードはどうなっているのでしょうか?
AndroidはもろにLinuxカーネルのカスタマイズだし、iOSもUNIXを源流に持つOSなのでどちらも改行コードはLFなのでしょうか???
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント
JavaではSystem.out.println()以外にもシステムプロパティを使うという手があり、よく使われています。
そうですね。システムプロパティ、System.getProperties()知っています。
[…] […]