質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

改行:CR, LF, CRLF の処理の区別

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 10K+
退会済みユーザー

退会済みユーザー

これら改行がプログラム上どのように処理されるのかが知りたいです。

タイトルの通りなのですが、調べてもいまいち腹に落ちる解が得られなかったので知識を頂戴させてください。

現状、各改行コードは以下の処理をしてる認識です。

CR  : MacOS
左端に寄せ (CR)
自動で改行

LF  : UNIX系  改行
自動で左寄せ
改行している (LF)

CRLF : Windows
左寄せ (CR)
改行   (LF)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • popobot

    2016/09/25 07:33

    質問の意図がわかりません。なぜこのように各OSで改行コードが違うのか理由が知りたいのでしょうか? それともこれらの違いをプログラムを書くときにどう処理したらいいかの知りたいのでしょうか?

    キャンセル

回答 3

+5

CR(Carrige Return) や LF(Line Feed) は古のタイプライターを
模した概念であり、コンピューター的には「改行」以上の意味は
ないと思います。
ドットインパクトプリンターを知っているならまだ分かるかも
しれませんが、現代では分かりにくい「動き」かもしれませんね。

ちなみに、Mac OS X にて改行を CR にして以下のスクリプトを動かすと

#!/bin/sh
echo 'HOGEHOGE'


なにもおこりません。
改行を LF にすると動くんですけどね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/26 21:27

    ありがとうございます。実際にタイプライターを模したペンと紙で理解できました。助かります

    キャンセル

checkベストアンサー

+4

改行コードの歴史や概要はWikipedia:改行コードによくまとまっていますので、まずはこちらを確認してみてください。

さて、上を踏まえて、プログラムではどのように処理されるのかを解説したいと思います。
※ 以下の文章で、UNIX/LinuxにはMac OS X(最新版はmacOSと名称変更)が含まれます。Mac OS XはUNIXの一つです。

プログラムでの動作

テキストモードとバイナリモード

C言語由来かC言語に影響を受けた言語の多くでは、ファイルを開くときに、テキストモードとバイナリモードという区別があります。それぞれのモードおよびOSの組み合わせで、ファイルの入出力時に改行コードの変換を行う場合があります。(標準入出力もファイル入出力の一つであり、デフォルトではテキストモードとして処理されます)

OS テキスト入力 テキスト出力 バイナリ入力 バイナリ出力
Windows CRLF->LF LF->CRLF (何もしない) (何もしない)
UNIX/Linux (何もしない) (何もしない) (何もしない) (何もしない)

つまり、プログラム内部では常に改行をLFとして扱い、入出力するときに自動変換される仕組みです。これはFTPのASCIIモードやgitのcore.autocrlfが有効な場合等も同じ動作をします。ただし、この動作はWindowsのみです。UNIX/Linuxではテキストモードとバイナリモードの区別は無く、どちらも同じ動作をします。

テキストストリームとバイナリストリーム

JavaやC#ではテキストモード・バイナリモードという考えてでは無く、テキストストリーム・バイナリストリームという考えで処理します。テキストストリームとして処理する場合、

  • 読み込み時は、CRLFCRLFのどれかであれば改行の区切りとして扱い、行単位で処理する。1行を取得したとき、末尾に改行コードは含まれない。(なので、改行コードがどれであっても同じ処理になる)
  • 書き込み時は、改行のみまたは最後に改行するメソッドを用い、システム規定の改行コードを出力する。

という動作になります。出力に関してはOSによって改行コードの規定値が異なることがありますが、入力はOSによって変わるということはありません。また、出力時の改行コードは変更することができます。

その他

旧MacのCRのみについて

Mac OS 9(以下、旧Mac)では、テキストにおける改行はCRでした。Mac OS XからはUNIX化下のに伴い、UNIX/Linuxと同じくLFのみになっています。旧Macは既にサポートもされておらず、動作するのは骨董品のMacのみです。旧Mac時代に作られたテキストファイルでなければ、改行がCRのみの処理について気にする必要はありません。

CRのみの場合のCUIでの動作

WindowsのコマンドプロンプトやUNIX/Linuxでのターミナルでは、CRはまさしくCRとして動作します。どういうことかというと、CRが入力されると、カーソルが行の先頭に戻ります。これを利用すると、CUIでもプログレスバーを表示するなどができます。

なお、WindowsのコマンドプロンプトでLFのみを渡しても、普通に改行され、カーソル位置は先頭になります。

通信プロトコルについて

多くの通信プロトコル(SMTPやHTTP等)では、改行コードをCRLFとしています。OS毎の動作が変わらないように、ネットワーク通信はバイナリのストリームとして扱い、プロトコルの仕様に従って改行コードを処理する必要があります。しかし、正しい改行コードを使っていない実装もありますので、実際はどのような改行コードであっても処理できるようにすべきでしょう。

telnetやSSH通信

通常、Enterキーを押したときに、クライアントからサーバへはCRのみが送られます。これは、押されたキーを送るのであって、改行コードを送っているというわけでは無いからです。つまり、本来のターミナルやコンソールでキーボードのEnterキーを押されたときにCRが送られると同じ動作をしているというわけで、CRのみであっても仮想ターミナル(pty)側で正しく改行してくれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/26 21:30

    質問の内容を含め非常に勉強になります。助かりました。

    キャンセル

+2

>これら改行がプログラム上どのように処理されるのかが知りたいです。

結論としては、OS次第か、テキスト編集・表示しているソフト次第となります。

改行コードですが、改行と次の行でのテキスト表示位置の左寄せの処理は
質問者さまの挙げた改行コードの組み合わせでも同じです。

CRとLFについてはタイプライターの動作が由来です。
(キーボードのキー配置もタイプライターが由来だったりします。)
LFが行送り(紙に文字を打つ行を1行分下にずらす)、
CRが文字を打つ装置の位置を左端に戻す、でした。

テキスト表示の動きを見ているとタイプライター的には全部CRLFですが
windows・unix・macの開発者がそれぞれのOSでどの組み合わせを
改行コードとしてEnterまたはReturnキーで認識するかを
質問者さまの挙げた通りの組み合わせにしちゃったようです。

CRとLFの改行コード文字自体はasciiコードの中に含まれていますが
どう扱うかはOSの開発者次第だったのかなぁと。

改行コードを指定する機能を持つテキストエディタならCR・LF・CRLFを指定して
テキストファイルの改行コードに応じて改行処理をしてくれます。
EnterまたはReturnキーを押した時は指定した改行コードを出力してくれます。
この機能を持つソフトは行末に改行コードの種類を区別して薄い色で文字表示してくれたり
ステータス表示部分にテキストファイルが改行コードとして認識しているものが
CR・LF・CRLFのどれかを表示する機能がついています。

windowsのメモ帳の様に改行コードを指定しないソフトはOSがEnterまたはReturnキーで
出力すると決めている改行コードを出力してそれを改行コードとして認識・表示します。

中にはwindowsでのMS word(Shift+Enter)やexcel(Alt+Enter)のようにOS標準の改行コード以外
を出力してテキスト表示の挙動を調整するソフトもあるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/26 21:29

    確かにexcel(Alt+Enter)ですね。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る