\n
(换行符)和\r
(回车符)有什么区别?
特别是和之间是否有实际区别?在某些地方应该使用一个而不是另一个?\n
\r
\n
(换行符)和\r
(回车符)有什么区别?
特别是和之间是否有实际区别?在某些地方应该使用一个而不是另一个?\n
\r
Answers:
就ASCII码而言,它是3-因为它们分别是10和13 ;-)。
但认真的说,有很多:
\n
是行尾代码,\r
没什么特别的\n
是行尾的标准转义序列(根据需要转换为OS特定的序列/从OS特定的序列转换为该序列)\r
用行尾代码代替\r\n
按此顺序\r\n
是Internet上文本格式的标准行终止符\r
命令滑架向左返回,直到碰到最左边的挡块(缓慢的操作),\n
命令滚轮滚动一行(更快的操作),这就是您始终拥有的原因\r
之前 \n
,以便滚轮可以在车架仍向左行驶时移动!-)维基百科有更详细的说明。\r
并\n
在光标方面相似的作用(除两者,因为是没有托架或滚柱;-)实际上,在现代的写入文本文件的上下文中,应始终使用\n
(如果您使用的是奇怪的操作系统(例如Windows;-,则底层的运行时将翻译该内容)。使用的唯一原因\r
是,如果您正在写到字符终端(或者更可能是模仿它的“控制台窗口”),并且希望您写的下一行覆盖您刚写的最后一行(有时用于愚蠢的“ ascii动画” ”,例如进度条的效果),尽管如此,但在GUI的世界中这已经过时了;-)。
\0
在后面添加了额外的无害字符(通常为NUL ie ),\n
以允许额外的时间。这是由操作系统透明处理的,因此您不会在旧版代码中找到任何痕迹。
\r
(我使用的是Linux)。一旦我开始解析似乎是有效的文件,解析器就会失败,因为要解析的文件已在Windows中创建。:d在所有主要的问题是,无论是\n
或\r
在如下意义上可见,对于例如a
,.
,(
等字符。
从历史上看\n
,使用a来将笔架向下移动,而\r
使用a来将笔架移回到页面的左侧。
printf("abcdefghijlm\rNOP\n");
在OpenSuSe上与gcc-8一起编译的C代码,并在终端上运行此结果NOPdefghijlm
。字符串中的\ r(回车)会导致光标移动到行(回车)的开头,而\ r后的字符(即“ NOP”)将覆盖之前的内容(即“ abc”)!您可以使用退格(\ b)来实现类似的“马车运动”,printf("abcdefghijlm\b\bNOP\n");
即产生的结果abcdefghijNOP
两个不同的字符。
\n
用作Unix文本文件中的行结束符
\r
用作Mac文本文件中的行结束符
\r\n
(即两者)用于终止Windows和DOS文本文件中的行。
\r
很长一段时间以来,Mac都不是行尾。随着2001年发布的Mac OS X(基于Unix)的使用,\n
现在可以使用它。
\r
-例如MS Office 2011 Excel:保存CSV(具有所有默认设置)-将保存带有\r
-line结尾的ISO-8859-1编码文件。
由于没有人特别提及它(他们还太年轻,不知道/不记得吗?)-我怀疑\r\n
打字机和类似设备使用了Origin。
当您在使用具有多行功能的打字机时想要换行时,它必须执行两个物理操作:将笔架滑回到页面的开头(在美国,左侧),并将纸张送入一个缺口。
回到行式打印机时代,例如,执行粗体文本的唯一方法是在不换行的情况下进行回车,并在旧字符上打印相同的字符,从而增加墨水量,从而使其看起来更暗(合并) 。当机械的“换行符”功能在打字机中失败时,这是令人讨厌的结果:如果您不注意,则可以在前一行文本上键入内容。
不同操作系统的两个不同字符。这在TCP/IP
需要使用的数据传输中也起着作用\r\n
。
\n
Unix系统
\r
苹果电脑
\r\n
Windows和DOS。
在Windows中,\ n移至下一行的开头。\ r移至当前行的开头,而不移至下一行。我已经在自己的控制台应用程序中使用了\ r,在其中我正在测试一些代码,并且我不想看到文本在屏幕上滚动,因此在打印出一些文本(例如帧频后, FPS),我将打印f(“%-10d \ r”,fps); 这将使光标返回到行的开头,而不会向下移动到下一行,并允许我在画面上不断滚动更新帧速率的同时显示其他信息(%-10表示确定输出至少为10个字符,并保持左对齐,以便最终以空格填充,并覆盖该行的所有旧值)。这样的事情非常方便
一点历史
/ r代表“归还”或“回车”,这归功于打字机的历史。回车将您的车一直向右移动,因此您在行首输入。
/ n代表“换行”,从打字机时代开始,您一直移到新行。不过,这并不是很重要,这就是为什么某些操作系统同时要求同时返回/ r和/ n换行符的原因,因为这是打字机执行输入命令的顺序。这也解释了使用旧式8位计算机的原因。从熟悉的“回车”中选择“返回”而不是“输入”。
只是增加了混乱,我一直在使用浏览器的HTML页面中的TextArea元素来开发一个简单的文本编辑器。考虑到CR / LF的兼容性问题,我编写了代码来检查平台,并使用适用于该平台的换行符。
但是,我在检查实际通过一个小的JavaScript函数 TextArea中包含字符,该函数生成了与字符相对应的十六进制数据。
为了进行测试,我输入了以下文本:
您好,世界[输入]
再见,残酷的世界[输入]
当我检查文本数据时,获得的字节序列是这样的:
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执行文本处理,并且需要使该文本处理平台独立,则需要牢记这一点。
以上文章中涉及的约定适用于控制台输出,但是看起来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();
}
让我们以这个示例为例,尝试将\ n替换为\ r它将不起作用,并尝试猜测原因?
Return
和Enter
。即使是我的现代无线键盘,仍然在旧Return
键上显示了向下和向后的箭头(现在标题为“ Enter”,与数字小键盘的Enter
键一致,该键不显示箭头)
\ n(换行符)和\ r(回车符)有什么区别?
特别是
\n
和之间是否有实际区别\r
?在某些地方应该使用一个而不是另一个?
我想\n
对换行符和\r
回车符各自的转义序列进行简短的实验,以说明它们之间的明显区别。
我知道,这个问题是与语言无关的。尽管如此,我们至少需要一种语言才能完成实验。就我而言,我选择了C ++,但是该实验通常应适用于任何编程语言。
该程序只是简单地迭代一次,即可通过for循环迭代将一个句子打印到控制台中。
换行程序:
#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
每个打印序列的末尾使用回车转义序列时,该序列的下一个迭代不会进入以下文本行-在每个打印序列的末尾,光标没有跳到下一行的* begin。
相反,光标在使用 \r
字符。-结果是打印序列的每个后续迭代都将替换先前的序列。
*注意:A \n
不一定要跳到以下文本行的开头。在某些(通常是更老的)操作系统上,\n
换行符的结果可能是,它跳到了下一行的任何地方,而不仅仅是跳到开头。因此,他们要求使用\r \n
来获取下一个文本行的开头。
该实验向我们展示了在打印序列迭代输出的上下文中换行符和回车符之间的区别。
在讨论输入时程序中时,某些终端/控制台可能会将回车符隐式转换为换行符,以实现更好的可移植性,兼容性和完整性。
但是,如果您可以选择另一个,或者只需要明确使用特定的一个,则应该始终使用适合其目的并严格区分的一个。