これら改行がプログラム上どのように処理されるのかが知りたいです。
タイトルの通りなのですが、調べてもいまいち腹に落ちる解が得られなかったので知識を頂戴させてください。
現状、各改行コードは以下の処理をしてる認識です。
CR : MacOS
左端に寄せ (CR)
自動で改行
LF : UNIX系 改行
自動で左寄せ
改行している (LF)
CRLF : Windows
左寄せ (CR)
改行 (LF)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
CR(Carrige Return) や LF(Line Feed) は古のタイプライターを
模した概念であり、コンピューター的には「改行」以上の意味は
ないと思います。
ドットインパクトプリンターを知っているならまだ分かるかも
しれませんが、現代では分かりにくい「動き」かもしれませんね。
ちなみに、Mac OS X にて改行を CR にして以下のスクリプトを動かすと
Sh
1#!/bin/sh 2echo 'HOGEHOGE'
なにもおこりません。
改行を LF にすると動くんですけどね。
投稿2016/09/25 01:17
総合スコア7468
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/09/26 12:27

0
ベストアンサー
改行コードの歴史や概要は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#ではテキストモード・バイナリモードという考えてでは無く、テキストストリーム・バイナリストリームという考えで処理します。テキストストリームとして処理する場合、
- 読み込み時は、
CR
、LF
、CRLF
のどれかであれば改行の区切りとして扱い、行単位で処理する。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/25 03:26
総合スコア21751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/09/26 12:30

0
これら改行がプログラム上どのように処理されるのかが知りたいです。
結論としては、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/25 01:00
総合スコア157
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/09/26 12:29

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。