LinuxとWindowsでは、\ nと\ rの処理はどのように異なりますか?


22

\n針を下に\r移動し、針を行の先頭に移動すると思います(左揃え)?しかし、よくわかりません。だから、私が間違っているなら私を修正してください....

とにかく、WindowsとLinuxは異なる処理をするnewlinesと言われましたcarriage returns。彼らがどのようにそれらをどのように扱うか、そして覚えておくことが重要ないくつかの場所を知りたいです。回答ありがとうございます。


これまでのところ、私はそれ\r\nがWindowsでは大丈夫ですが、そうで\n\rはないことを知っています\r\n。また、私はそれ\nが人々がLinuxで使用するもの\rであり、単独で使用されるのと同じ目的ではないと聞いてい\r\nます。 \r本当に古いMacOSで使用されています。ただし、これらの事実は確認していません。
千里ちゃん

4
どのように処理されるかは、使用している場所に依存するため、それら\r\n、およびに呼び出さない\nでください。よりよいそれらを呼び出すためにCRLF
イグナシオバスケス-エイブラムス

イグナシオ、これらの頭字語は私には意味がありません。これはなんて言うのか :/?ああ... LINEフィードとキャリッジリターン。ありがとう、スレスケ。
千里ちゃん

@ IgnacioVazquez-Abrams \ nはLFと同一ではありませんか?ASCIIチャートでは、文字13 = \ n = LFではありませんか?
-barlop

1
@barlop:Windowsで出力する場合、Cにはありません。
イグナシオバスケス-エイブラムス

回答:


21

\ nは針を下に移動し、\ rは針を行の先頭に移動すると思います(左揃え)?わからないけど

これは多かれ少なかれ真実ですが、ほとんどは歴史的な好奇心です。当初は、プリンターとハードコピー端末(テレプリンター)で用紙を1行進めるためにラインフィード(LF)が使用されていました。キャリッジリターン(CR)は、プリントヘッドを行の先頭に戻しました。

これはおそらく、「テキストモード」で使用された場合でも最新のプリンターで動作する可能性がありますが、それ以外は今日ではほとんど意味がありません。

とにかく、WindowsとLinuxは改行とキャリッジリターンを別々に処理すると言われました。

違いは単純です。OS設計者は、コンピューターファイル内のテキストで新しい行の開始を表す方法を選択する必要がありました。さまざまな歴史的理由により、Unix / Linuxの世界では、単一のLF文字が改行マーカーとして選択されました。MS-DOSはCR + LFを選択し、Windowsはこれを継承しました。したがって、プラットフォームごとに異なる規則が使用されます。

実際には、これはますます問題になりつつあります。改行マーカーは、実際には「プレーンテキスト」を処理する絵文字にのみ関係し、それほど多くはありません。ほとんどは、プログラムのソースコード、構成ファイル、およびドキュメント付きのいくつかの単純なテキストファイルにのみ影響します。現在、これらの種類のファイル(エディター、コンパイラーなど)を処理するほとんどのプログラムは、両方の改行規則を処理できるため、どちらを選択してもかまいません。

ツールが「それらの」改行規則を要求する場合があります(たとえば、UnixシェルスクリプトはCR + LFを使用してはなりません)。その場合、正しいものを使用する必要があります。


同じ質問行:プログラミング言語は同じであると認識\n\r\nていますか?たとえば、他の人のPCで編集されたテキストファイルを解析していて、LinuxとWindowsの両方のバージョンの改行が含まれているpreg_match場合、for \nを実行すると\n\r異なる結果が得られますか?
千里ちゃん

@千里ちゃん:これはプログラミング言語、コンパイラなどに完全に依存します。特に、正規表現を使用する場合は、使用する正規表現エンジンに依存します-異なる行末を区別するもの、しないもの(ほとんどはどちらでも構成できます私は信じている)。
-sleske

@千里ちゃん:システム/プログラミング言語/正規表現エンジンが異なる改行規則をどのように処理するかについて質問がある場合は、別の質問としてこれを尋ねてください。
-sleske

あなたは\ r \ nを間違った方法で書いてはいけません。プログラミング言語に関しては、それらは個々の文字を読むことができ、プログラマーは入力で使用されているものを見ることができます。また、プログラマーは出力に対して望むように行うことができます。「ABCに続いて\ r \ r \ r \ nを書く」と言うことができるように、最後に貼り付けたい文字を入力してください。他のいくつかの文字は、印刷可能ではなく、グラフィカルでも何でもありません。彼らはprintlnのようないくつかの組み込み関数を持っているかもしれません、そして、彼らが彼らの新しい行に使用するものはどちらかであるでしょう、それは両方であることができません。
barlop

@千里ちゃんと一部のプログラミング言語では、組み込み関数の1つで設定として終了するものを選択できるため、理論的には組み込み関数でも可能です。+前述のように、実際には、希望する行末を記述できますが、println関数のように効率的に行なえない場合があります。
-barlop

14

CRおよびLF

情報交換のためのアメリカ標準コード(ASCII)は、CARRIAGE-RETURN(CR)およびLINE-FEED(LF)を含む制御文字を定義しました。これらは、プリンターの印刷位置を初期のコンピュータープリンターに先行する機械式タイプライター。

プラットフォーム依存

Windowsでは、テキストファイルの従来の行区切り文字はCRの後にLFが続きます

古い(OSX以前)Apple Macintoshシステムでは、テキストファイルの従来の行区切り文字はCRでした

UnixおよびLinuxでは、テキストファイルの従来の行区切り文字はLFです。

\ nおよび\ r

多くのプログラミングおよびスクリプト言語で\nは、「改行」を意味します。時々(ただし常にではない)、これはASCII LINE-FEED文字(LF)を意味します。これは、言うように、カーソル(または印刷位置)を1行下に移動します。プリンターまたはタイプライターでは、実際に用紙を1行上に移動します。

常に\rASCII CARRIAGE-RETURN文字(CR)を意味します。その名前は、紙を運ぶローラー(「キャリッジ」)がバネで動かされたキャリッジリターンキーがあった機械式タイプライターに由来します。それが行く限り。したがって、現在の入力位置を左マージンに設定します。

プログラミング

一部のプログラミング言語\nでは、テキストファイル内の行を終了または分離するプラットフォーム依存の文字シーケンスを意味する場合があります。たとえば、Perlでは、print "\n"LinuxとWindowsでは異なる文字列が生成されます。

Javaでは、ランタイムプラットフォームでネイティブの行末を使用する\n場合\r、使用しないか、まったく使用しないことをお勧めします。を使用する必要がありますSystem.getProperty("line.separator")。あなたは使用する必要があります\nし、\rあなたがプラットフォームに関係なくLFとCRを配置したい場所(HTTP、FTPおよび他のインターネットの通信プロトコルで使用される例として)。

Unix stty

Unixシェルでは、sttyコマンドを使用して、これらのさまざまな規則間でシェルを変換できます。たとえばstty -onlcr、シェルはその後すべての発信LFをCR LFに変換します。

LinuxおよびOSXはUnixの規則に従います

テキストファイル

テキストファイルは依然として非常に重要であり、広く使用されています。たとえば、HTMLおよびXMLはテキストファイルの例です。HTTPなどの重要なインターネットプロトコルのほとんどは、テキストファイルの規則に従っており、行末の仕様が含まれています。

プリンター

最も安価なプリンター以外のほとんどのプリンターは、CRとLFを尊重しています。実際、これらは最も広く使用されているページ記述言語であるPCLおよびPostscriptの基本です。


1
Javaに関する注意:「\ nまたは\ rをまったく使用しない」ことは一般的に正しくありません。Javaでは、「\ n」は常にLFであり、「\ r」は常にCRです。これまさにあなたが望むものかもしれません。特定の行末スタイルが必要な場合は、それらを使用します。実行しているコンピューターのネイティブ行の終了を明示的に必要とする場合は、使用しますline.separator。それは本当にあなたが望むものに依存します。
-sleske

ところで、println()自動的にを使用するline.separatorため、ネイティブの行末println()が必要な場合は使用できます(特定の行末が必要な場合は使用せず、明示的に "\ n"などを使用します)。
-sleske

@sleske:良い点。それに応じて回答を更新します。
RedGrittyBrick

1
\nASCII LF以外の制御文字(EBCDICベースのシステム以外)がある言語またはコンパイラはありますか?私は\n、文字列または文字リテラルで何を意味するかについて言及しているのであって、それをファイルまたは出力デバイスに送ることの効果について言及しているわけではありません。
キーストンプソン

1
@KeithThompson:Javaの場合:はい、\nJLSが明示的に言っているため、常にASCII(およびUnicode)コード10です(JLS 3.10.6、「文字および文字列リテラルのエスケープシーケンス」-私はチェックしました:-))。他の言語の場合-良い質問です。
-sleske

4

要するに、プリンタには必要でしたが、現在はOSによって少し異なった方法で行われています。ほとんどの場合、CRとLFの両方を実行するだけで問題ありません\r\n。ほとんどの場合、これは正常に機能します。


Linuxは単にそれを無視するのです\rか、それとも何らかの動作の変化を引き起こしますか?
アーロンフランケ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.