\ nと\ rの違いは?


609

\n(改行)と\r(キャリッジリターン)の違いは何ですか?

特に、との間に実際的な違いは\nあり\rますか?一方を他方の代わりに使用する必要がある場所はありますか?


3
すべての答えはかなり予測可能ですが、\ nと\ rの間に実際的な違いがあるかどうかを知りたいと思います。片方をもう片方に使用する必要がある場所はありますか?
Vlad the Impala

9
はい、そうです。LF(改行)のみのテキストファイルは、一部のWindowsアプリケーションでは終了と見なされず、CRLFで終了するテキストファイルは、一部のLinusアプリケーションで開くと余分な文字が表示されます。
パビウム2009年

2
はい、\ rは一部のLinuxコンソールアプリで回転線アニメーションを実行するために使用されます。
Murali

8
\ rはまだ通常のMac EOLですか?それは「クラシック」Mac用だと確信していますが、OS XがUnix化されていると思っていました。(私がMacに慣れていることを示していますか?)
John Y

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

回答:


827

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行巻き上げるように命令します(はるかに速い操作)-これが常にある理由です\r 以前 \nは、キャリッジがまだ左に進んでいるときにローラーが動くように!-)ウィキペディアには、より詳細な説明があります。
  • 文字モード端末(通常、上記のようにさらに古い印刷端末をエミュレート)、rawモード、\rおよび\n同様に動作(キャリッジに関してもローラーないため、カーソルに関して両方を除く;-)

実際には、テキストファイルへの書き込みの最新のコンテキストでは、常に使用する必要があります\n(Windowsなどの奇妙なOSを使用している場合は、基盤となるランタイムによって変換されます;-)。使用する唯一の理由\rは、キャラクターターミナル(またはそれをエミュレートする「コンソールウィンドウ」)に書き込んでいて、書き込んだ最後の行を上書きする次の行が必要な場合(間抜けな「アスキーアニメーション」に使用される場合があります) "プログレスバーなどの影響)-これはGUIの世界ではかなり時代遅れになっています;-)。


12
この回答に歴史に追加するには、次の回線速度は、毎秒10個の文字から増加すると、それはリターンにキャリッジのための時間の2つの以上の文字の価値を取って、余分な無害な文字(通常はNULすなわち\0)の後に追加された\n余分を許可します時間。これはOSによって透過的に処理されたため、レガシーコードでその痕跡は見つかりません。
Mark Ransom 2012

11
Windowsはどのように「奇妙な」オペレーティングシステムですか?
mailmindlin 2014年

31
@mailmindlin-あなたは「windowsは「奇妙な」オペレーティングシステムですか?」と尋ねます。回答:簡単に数えることのできない方法で(靴下を履いているため、つま先は許可されていません:-)。他のすべての生き残っているOSはUnixベースです... Windowsは唯一の方法であり、多くの方法でWAYをしています。この特定のQのコンテキストでは、これは、正規の行末として2バイト(\ n \ r)をポジティブ化する唯一の1つです...スレッド上の他の場所で説明されている古代歴史的なものを除いて、賢明な理由はありません...他のすべてのOS単一の文字a5の行末があります(それらの99%以上は「\ n」)
Alex Martelli、2014

1
@nothingisnecessary:たとえば、RFC 2822に代わるtools.ietf.org/html/rfc5322は、電子メールメッセージの形式を定義しています。
キーストンプソン

3
人生のある時点である種のパーサーを書くすべての人への小さなアドバイス-行の終わりを適切に処理することを忘れないでください。\r(Linuxを使用している)のことを忘れただけで、かなり厄介な経験をしました。有効なファイルと思われるものの解析を開始すると、解析しているファイルがWindowsで作成されているため、パーサーが失敗しました。:Dもないことである全ての主な問題\n\r意味で可視であること、例えばa.(文字等です。
rbaleksandar

122

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


8
おそらくコンピュータの質問に対するひどく実用的な答えではないかもしれませんが、とにかく歴史的な一口が私から賛成票を得ています。
John Y

1
物理的なタイピングマシンのタイピング部分を左に押したときと同じように\ rと想像してください。戻ります。
Jo Smo 2016年

2
\ nキャリッジは下に移動しません。ローラーを回して用紙を上に移動します。
Roddy

5
すべての動きは相対的です。紙は私の世界であり、それに関連して、キャリッジは下に移動します:P
tster

2
FWIW、\ rは現在のシステムでは「キャリッジリターン」である可能性があります。printf("abcdefghijlm\rNOP\n");OpenSuSeでgcc-8を使用してコンパイルされ、ターミナルで実行されるこのCコードを検討すると、この出力が生成されますNOPdefghijlm。文字列の\ r(キャリッジリターン)により、カーソルが行の先頭(キャリッジ)に移動し、\ rに続く文字(つまり、「NOP」)により、以前の文字(つまり、「abc」)が上書きされます。と同様に、バックスペース(\ b)で同様の「キャリッジムーブメント」を実現できprintf("abcdefghijlm\b\bNOP\n");ますabcdefghijNOP
GMc '12年

36

2つの異なる文字。

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

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

\r\n (つまり両方)WindowsおよびDOSテキストファイルの行を終了するために使用されます。


2
AcornやRISC OSのようにEnterキーを押したときに、行末マーカーとして\ n \ rを使用したコンピューターがあったことに注意してください。
Anders 14

9
明確にするために:\r長い間、Macの行末ではありませんでした。2001年のMac OS Xのリリース(Unixベース)で\n使用されています。
jbbuckley 2015

3
しかし、まだ使用しているアプリケーションがいくつかあります\r-たとえば、MS Office 2011 Excel:CSV(すべてのデフォルト設定で)を保存-は、\r行末がISO-8859-1でエンコードされたファイルを保存します。
CodeBrauer 2017

24

他の誰もそれを具体的に言及しなかったので(彼らは若すぎて知ったり覚えたりすることができませんか?)-私\r\nはタイプライターや類似のデバイス用のoriginedの使用を疑っています。

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

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


3
改行のASCII標準は\ r \ nです。(Bell Telephoneが標準化委員会の制御を得た短い間隔は別として)。電話の独占と引き換えに、Bell Telephoneはメッセージングビジネス(テレグラム、テレタイプ)をあきらめ、標準の既存の使用については気にしませんでした。HTTP、HTML、PCDOS、MSDOSはASCII標準を使用しました。Bell Telephoneは、互換性のある既存のビジネスがなかったため、UNIXの非標準化を選択しました。
david

12

異なるオペレーティングシステム用の2つの異なる文字。また、TCP/IPこれはの使用を必要とする送信データにも影響します\r\n

\n Unix

\r マック

\r\n WindowsおよびDOS。


10
アプリケーション・プロトコルと混同していると思いますが、TCP / IPは\ nと\ rを認識していません。
jean-loup 14

4
TCP / IPでは、\ r \ nを使用する必要はありません。SMTP、POP3、FTP、HTTPなどを含む、Telnetに基づくさまざまなプロトコルがそれを必要とします
Marquis of Lorne

9

完了するには

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

たとえば、次を試してください。

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • 最初の「エコー」ディスプレイ AA--AA
  • 二番目 : AA--AABB
  • 最後 : BB--AABB

ただし-en、パラメータとして使用することを忘れないでください。


5

ウィンドウでは、\ nは次の行の先頭に移動します。\ rは、次の行に移動することなく、現在の行の先頭に移動します。コードをテストしている自分のコンソールアプリで\ rを使用しており、画面を上にスクロールするテキストを見たくないので、たとえばフレームレートなどのテキストを印刷した後に\ nを使用するのではなく( FPS)、私はprintf( "%-10d \ r"、fps); これにより、カーソルが次の行に移動せずに行の先頭に戻り、フレームレートが常に同じ行で更新されている間、スクロールされない他の情報を画面に表示できます(%-10出力が少なくとも10文字であり、左揃えされているため、スペースで埋められ、その行の古い値が上書きされていることを確認してください)。このようなものには非常に便利です。

ちょっとした歴史

/ rは「リターン」または「キャリッジリターン」を表しており、タイプライターに履歴があります。改行でキャリッジが右端に移動したため、行の先頭で入力していました。

/ nは「改行」を表します。タイプライターの時代から改行したものです。ただし、本質的には最初からではありません。そのため、一部のOSでは、/ rリターンと/ n改行の両方が必要でした。これは、タイプライターが行った順序であったためです。おなじみの「キャリッジリターン」から「Enter」ではなく「Return」を持っていること。


1

混乱を増すために、私はブラウザーのHTMLページでTextArea要素を使用する単純なテキストエディターに取り組んできました。CR / LFに関する互換性の問題を予測して、プラットフォームをチェックするコードを記述し、プラットフォームに適用可能な改行規則を使用しました。

しかし、TextAreaに含まれる実際の文字をチェックするときに、文字に対応する16進データを生成する小さなJavaScript関数を介して、興味深いことがわかりました。

テストでは、次のテキストを入力しました。

こんにちは、世界[入力]

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

テキストデータを調べたところ、取得したバイトシーケンスは次のとおりです。

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プラットフォームで取得されたと思います。しかし、ここに問題があります。Windows7 64ビットのGoogle Chromeで取得したこのシーケンスです。

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

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


0
#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を配置してみます。\ rは機能せず、理由を推測してみますか?


1
これは、MS DOS、DECS TOPS-10、CP / M、RT-11など、Enterキーを押したときに下線を引くOSが\ r \ nを送信する場合にのみ機能します。OSの場合:Multic、Unix、Unix-like( Linux、Minixなど)BeOS、RISCOSなどのENTERキーは\ n文字のみを送信します。
Anders 14

1
キーボードの両方を持っていた古き良き時代はいああReturnEnter。私の最近のワイヤレスキーボードでも、古いReturnキー(Enter矢印が表示されていないテンキーのキーと一致するように「Enter」とタイトルが付けられています)に
上下

0

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

特に、との間に実際的な違いは\nあり\rますか?一方を他方の代わりに使用する必要がある場所はありますか?


\n改行と\rキャリッジリターンのそれぞれのエスケープシーケンスを使用して短い実験を行い、両者の明確な違いを説明します。

この質問が言語に依存しないものとして質問されたことは知っています。それにもかかわらず、少なくとも実験を遂行するためには言語が必要です。私の場合、私はC ++を選択しましたが、実験は一般的にどのプログラミング言語にも適用できます。

プログラムは単純に反復して、for-loop反復によって実行された文をコンソールに出力します。


改行プログラム:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

出力:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

この結果はどのシステムでも提供されないことに注意してください。このC ++コードを実行しています。しかし、それは最新のシステムで機能します。詳細については、以下をお読みください。


さて、同じプログラムですが、違いはありますが、印刷シーケンスの最後に\n置き換えられ\rます。

キャリッジリターンプログラム:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

出力:

7.Walkthrough of the for-loop 

違いがどこにあるのか気付きましたか?違いは単に\r、各印刷シーケンスの最後にキャリッジリターンエスケープシーケンスを使用すると、このシーケンスの次の反復が次のテキスト行に入らないことです-各印刷シーケンスの最後に、カーソルは*次の行の先頭にジャンプしました。

代わりに、カーソルは、\r文字を使用する前に、行末(行末)にジャンプして戻りました。-結果は、印刷シーケンスの後続の各反復により、前のシーケンスが置き換えられます。

*注意:A \nは必ずしも次のテキスト行の先頭にジャンプする必要はありません。一部の、一般的にはより古いオペレーティングシステムでは、\n改行文字の結果として、先頭だけでなく次の行のどこにでもジャンプすることがあります。そのため、\r \n次のテキスト行の先頭に到達するために使用する必要があります。


この実験は、印刷シーケンスの反復の出力のコンテキストでの改行とキャリッジリターンの違いを示しました。

プログラムの入力について説明するとき、一部の端末/コンソールは、移植性、互換性、および整合性を向上させるために、キャリッジリターンを暗黙的に改行に変換する場合があります。

ただし、別のものを選択するか、特定の1つだけを明示的に使用する必要がある場合は、常にその目的に適合し、厳密に区別できるものを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.