web-dev-qa-db-ja.com

\ nと\ rの違いは?

\n(改行)と\r(改行)の違いは何ですか?

特に、\n\rの間に 実用的 の違いはありますか?一方を他方の代わりに使用すべき場所はありますか。

507
3zzy

ASCIIコードに関しては、それぞれ10と13であるため、3です;-)。

しかし、真剣に、多くがあります:

  • unixおよびすべてのUnixライクシステムでは、\nは行末コードであり、\rは特別なものを意味しません
  • 結果として、Cおよび何らかの形で(リモートでも)コピーするほとんどの言語では、\nは行末の標準エスケープシーケンスです(必要に応じてOS固有のシーケンスとの間で変換されます)。
  • 古いMacシステム(OS X以前)では、\rは代わりに行末のコードでした
  • windows(および多くの古いOS)では、行末のコードはこの順序で\r\nの2文字です
  • (驚くべきことに-)結果として(Windowsよりもはるかに古いOSを思い起こさせる)、\r\nはインターネット上のテキスト形式の標準的な行末です。
  • 電気機械テレタイプのような「ターミナル」の場合、\rは左端に停止するまでキャリッジを左方向に戻すように命令し(低速操作)、\nはローラーに1行巻き上げるように命令します(はるかに高速)操作)-それが常に\rbefore\nを持っているため、キャリッジが移動している間にローラーが移動できるようにするためです。まだ左に行く!-)ウィキペディアには 詳細な説明 があります。
  • 文字モード端末(通常、上記のように偶数の古い印刷端末をエミュレート)、rawモードでは、\rおよび\nは同様に動作します(カーソルの点で両方を除くisキャリッジまたはローラーなし;-)

実際には、テキストファイルへの書き込みという現代のコンテキストでは、常に\nを使用する必要があります(Windowsなどの奇妙なOSを使用している場合、基礎となるランタイムはそれを変換します;-)。 \rを使用する唯一の理由は、文字端末(または、おそらくそれをエミュレートする「コンソールウィンドウ」)に書き込みを行い、次に書き込む行で、最後に書き込んだ行を上書きすることです(使用される場合があります)進行状況バーなどの間抜けな「asciiアニメーション」効果のため)-これはGUIの世界ではかなり時代遅れになっています;-)。

749
Alex Martelli

歴史的には、\nはキャリッジを下に移動するために使用され、\rはキャリッジをページの左側に戻すために使用されていました。

112
tster

2つの異なるキャラクター.

Unixテキストファイルでは、\nが行末ターミネータとして使用されています

\rは、Macのテキストファイルでは行末ターミネータとして使われています

\r\n(つまりboth)は、WindowsとDOSのテキストファイルの行を終了するために使用されます。

29
pavium

他に誰もそれを具体的に述べていないので(知っている/覚えておくには若すぎますか?) - 私は\r\nの使用がタイプライターや同様の装置に由来すると思います。

複数行に対応したタイプライターを使用しているときに新しい行が必要な場合は、2つの物理的なアクションを実行する必要がありました。キャリッジをページの先頭(米国では左)までスライドさせ、用紙を1段切り上げる。

たとえば、太字のテキストを印刷する唯一の方法は、改行なしでキャリッジリターンを実行し、古い文字の上に同じ文字を印刷して、インクを追加して暗く表示することでした。 。機械的な「改行」機能がタイプライターで失敗したとき、これは厄介な結果でした。あなたが注意を払わなかったなら、あなたはテキストの前の行を上書きすることができました。

20

異なるオペレーティングシステム用の2つの異なる文字。 これは、TCP/IPを介して転送されるデータでも役割を果たします。\r\nを使用する必要があります

\n Unix

\r Mac

\r\n WindowsとDOS。

11
a432511

完了するために、

シェル(bash)スクリプトでは、\rを使ってカーソルを行頭に送り、もちろん\nを使ってカーソルを新しい行に置くことができます。

たとえば、

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • 最初の "echo"表示AA--AA
  • 第二:AA--AABB
  • 最後:BB--AABB

しかし-enをパラメータとして使うことを忘れないでください。

9
Akarun

Windowsでは、\ nは次の行の先頭に移動します。\rは、次の行に移動せずに現在の行の先頭に移動します。私は自分のコンソールアプリケーションでコードをテストしているところでテキストを画面上にスクロールしたくないので、自分のコンソールアプリケーションで使っています。 FPS)、私はprintf( "% - 10d\r"、fps)します。これは次の行に移動することなくカーソルを行の先頭に戻し、フレームレートが常に同じ行で更新されている間にスクロールされない他の情報を画面に表示できるようにします(%-10は出力が少なくとも10文字であることを確認し、左寄せにしてスペースで埋めて、その行の古い値を上書きします。これは、私がコンソール画面にデバッグ情報を出力しているときによく使われます。

ちょっとした歴史

/ rは "return"または "キャリッジリターン"の略で、タイプライターの歴史です。キャリッジリターンがキャリッジを右端まで移動させたため、行頭で入力していました。

/ nは、改行した日から新しい行に移動したときの「改行」を表します。それがタイプライターがそれをした順序であったので、それはそれの開始に躊躇しないけれども、それはなぜいくつかのOSが/ r改行に続く/ n改行の両方の必要性を採用した。 「キャリッジリターン」から、「Enter」ではなく「Return」を使用すること。

3
Neil Roy

混乱を招くだけですが、私はブラウザのHTMLページのTextArea要素を使用して簡単なテキストエディタを作成しています。 CR/LFに関して互換性の問題があることを見越して、私はプラットフォームをチェックするためのコードを書き、そのプラットフォームに適用可能な改行規約を使用しました。

しかし、TextAreaに含まれる actual 文字をチェックするときに、文字に対応する16進数データを生成する小さなJavaScript関数を介して、面白いことを発見しました。

テストのために、私は次のテキストを入力しました:

こんにちは、世界[enter]

さようなら、残酷な世界[enter]

テキストデータを調べたときに得られたバイトシーケンスは次のとおりです。

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

さて、ほとんどの人はこれを見て、0aだが0dバイトは見えないが、この出力はUnix/Linuxプラットフォームで得られたと思うだろう。しかし、ここにこすれがあります:私はWindows 7 64ビット上のGoogle Chromeで得たこのシーケンス。

そのため、TextArea要素を使用してテキストを調べる場合は、上で行ったように出力をチェックして、実際の文字バイトがTextAreaから返されることを確認します。これが他のプラットフォームや他のブラウザと異なるかどうかはまだわかりませんが、JavaScriptを介してテキスト処理を実行している場合は、そのテキスト処理プラットフォームを独立させる必要があります。

上記の記事で取り上げられている規約は console outputに適用されますが、HTML要素はUNIX/Linuxの規約に準拠しているようです。他の人が別のプラットフォームやブラウザで発見しない限り。

0
David Edwards
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

この例を見てみましょう\ rの代わりに\ nを入れてみてください。

0