\n
(改行)と\r
(キャリッジリターン)の違いは何ですか?
特に、との間に実際的な違いは\n
あり\r
ますか?一方を他方の代わりに使用する必要がある場所はありますか?
\n
(改行)と\r
(キャリッジリターン)の違いは何ですか?
特に、との間に実際的な違いは\n
あり\r
ますか?一方を他方の代わりに使用する必要がある場所はありますか?
回答:
ASCIIコードに関しては、それぞれ10と13なので3です。
しかし真剣に、たくさんあります:
\n
は、行末のコードであり、\r
特別な意味はありません\n
は、行末の標準エスケープシーケンスです(必要に応じてOS固有のシーケンスとの間で変換されます)。\r
代わりに行末のコードでした\r\n
はこの順序で2文字、\r\n
せる)として、インターネット上のテキスト形式の標準の行末\r
、キャリッジが左端に戻るまで左に戻るように命令し(遅い操作)、\n
ローラーに1行巻き上げるように命令します(はるかに速い操作)-これが常にある理由です\r
以前 \n
は、キャリッジがまだ左に進んでいるときにローラーが動くように!-)ウィキペディアには、より詳細な説明があります。\r
および\n
同様に動作(キャリッジに関してもローラーもないため、カーソルに関して両方を除く;-)実際には、テキストファイルへの書き込みの最新のコンテキストでは、常に使用する必要があります\n
(Windowsなどの奇妙なOSを使用している場合は、基盤となるランタイムによって変換されます;-)。使用する唯一の理由\r
は、キャラクターターミナル(またはそれをエミュレートする「コンソールウィンドウ」)に書き込んでいて、書き込んだ最後の行を上書きする次の行が必要な場合(間抜けな「アスキーアニメーション」に使用される場合があります) "プログレスバーなどの影響)-これはGUIの世界ではかなり時代遅れになっています;-)。
\0
)の後に追加された\n
余分を許可します時間。これはOSによって透過的に処理されたため、レガシーコードでその痕跡は見つかりません。
\r
(Linuxを使用している)のことを忘れただけで、かなり厄介な経験をしました。有効なファイルと思われるものの解析を開始すると、解析しているファイルがWindowsで作成されているため、パーサーが失敗しました。:Dもないことである全ての主な問題\n
や\r
意味で可視であること、例えばa
、.
、(
文字等です。
歴史的に、a \n
はキャリッジを下に移動するため\r
に使用され、キャリッジはページの左側に移動するために使用されました。
printf("abcdefghijlm\rNOP\n");
OpenSuSeでgcc-8を使用してコンパイルされ、ターミナルで実行されるこのCコードを検討すると、この出力が生成されますNOPdefghijlm
。文字列の\ r(キャリッジリターン)により、カーソルが行の先頭(キャリッジ)に移動し、\ rに続く文字(つまり、「NOP」)により、以前の文字(つまり、「abc」)が上書きされます。と同様に、バックスペース(\ b)で同様の「キャリッジムーブメント」を実現できprintf("abcdefghijlm\b\bNOP\n");
ますabcdefghijNOP
2つの異なる文字。
\n
Unixテキストファイルで行末のターミネータとして使用されます
\r
Macのテキストファイルで行末のターミネータとして使用されます
\r\n
(つまり両方)WindowsおよびDOSテキストファイルの行を終了するために使用されます。
\r
長い間、Macの行末ではありませんでした。2001年のMac OS Xのリリース(Unixベース)で\n
使用されています。
\r
-たとえば、MS Office 2011 Excel:CSV(すべてのデフォルト設定で)を保存-は、\r
行末がISO-8859-1でエンコードされたファイルを保存します。
他の誰もそれを具体的に言及しなかったので(彼らは若すぎて知ったり覚えたりすることができませんか?)-私\r\n
はタイプライターや類似のデバイス用のoriginedの使用を疑っています。
複数行対応のタイプライターを使用しているときに改行が必要な場合、実行する必要のある2つの物理的なアクションがありました。キャリッジをページの先頭(米国では左)に戻し、用紙を1ノッチ上に送ります。 。
たとえば、ラインプリンタの時代には、太字のテキストを作成する唯一の方法は、改行なしでキャリッジリターンを実行し、古い文字の上に同じ文字を印刷して、インクを追加し、暗い(太字)に見せることでした。 。タイプライターで機械的な「改行」機能が失敗したとき、これは厄介な結果でした。注意していなければ、前のテキスト行を上書きすることができました。
異なるオペレーティングシステム用の2つの異なる文字。また、TCP/IP
これはの使用を必要とする送信データにも影響します\r\n
。
\n
Unix
\r
マック
\r\n
WindowsおよびDOS。
ウィンドウでは、\ nは次の行の先頭に移動します。\ rは、次の行に移動することなく、現在の行の先頭に移動します。コードをテストしている自分のコンソールアプリで\ rを使用しており、画面を上にスクロールするテキストを見たくないので、たとえばフレームレートなどのテキストを印刷した後に\ nを使用するのではなく( FPS)、私はprintf( "%-10d \ r"、fps); これにより、カーソルが次の行に移動せずに行の先頭に戻り、フレームレートが常に同じ行で更新されている間、スクロールされない他の情報を画面に表示できます(%-10出力が少なくとも10文字であり、左揃えされているため、スペースで埋められ、その行の古い値が上書きされていることを確認してください)。このようなものには非常に便利です。
ちょっとした歴史
/ rは「リターン」または「キャリッジリターン」を表しており、タイプライターに履歴があります。改行でキャリッジが右端に移動したため、行の先頭で入力していました。
/ nは「改行」を表します。タイプライターの時代から改行したものです。ただし、本質的には最初からではありません。そのため、一部のOSでは、/ rリターンと/ n改行の両方が必要でした。これは、タイプライターが行った順序であったためです。おなじみの「キャリッジリターン」から「Enter」ではなく「Return」を持っていること。
混乱を増すために、私はブラウザーの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の規則に準拠しているようです。別のプラットフォーム/ブラウザで他の人が発見しない限り。
#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は機能せず、理由を推測してみますか?
Return
とEnter
。私の最近のワイヤレスキーボードでも、古いReturn
キー(Enter
矢印が表示されていないテンキーのキーと一致するように「Enter」とタイトルが付けられています)に
\ 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つだけを明示的に使用する必要がある場合は、常にその目的に適合し、厳密に区別できるものを使用する必要があります。