改行コード UNIXやLinux (LF)、Windows (CRLF)、Mac OS (CR) の違いと変換方法、Androidでは?

スポンサーリンク
ITで知っておくべき知識

改行コードって、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については以下をご覧ください。

BOM(バイトオーダーマーク, byte order mark, ボム)ではまった話
今回は、BOM(バイトオーダーマーク, byte order mark, ボム)の話です。 BOM(バイトオーダーマーク, byte order mark, ボム)って何? BOMとは、Unicodeのテキストの先頭に付...

 

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

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

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

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

リダイレクトについては以下をご覧ください。

標準出力と標準エラー出力 (stderr) へコマンドプロンプトにてリダイレクト、パイプの使い方
標準出力と標準エラー (stderr) へコマンドプロンプトでリダイレクト、パイプの使い方をまとめてみました。 標準出力と標準エラー出力を同時に(または別ファイルに)リダイレクトする方法も調べてみました。 標準ストリーム(S...

 

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

 

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

 

UNIXやLinuxでは、

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 iOSの改行コードは?

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

AndroidはもろにLinuxカーネルのカスタマイズだし、iOSもUNIXを源流に持つOSなのでどちらも改行コードはLFなのでしょうか???

 

プログラミングの無料レッスン体験

 

約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp

<Codecampの特徴>

1 現役エンジニアによる指導

2オンラインでのマンツーマン形式の講義

3大手企業にも導入されている実践的なカリキュラム

 

↓無料体験レッスン実施中です。

プログラミングのオンラインスクールCodeCamp

 

コメント

  1. 匿名 より:

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

  2. […] […]