欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

为什么CR代表回车,LF代表换行? 有大用 有大大用 有大大大用

对于CRLF这个词来说,相信搞开发的应该都不会陌生,其意思是回车换行

但是对于这个普遍解释,我还有以下两点疑问

1.为什么CR代表回车,LF代表换行?

2.回车和换行到底是什么东西,'\r','\n'又是什么东西?

答1:


        关于为什么用CRLF代表回车换行,则要提一下一个历史问题,相信大家在电视上看美国一些老电影的时候都看过打字员使用打字机的场景,当打字到一行尾部的时候,机器会有两个操作,一个是打印的针头会调回到开始处;另一个是打印纸同时会向下移动一行。对于前者就叫做Carriage Return(Carriage Return可以翻译为机器滑动的部分回到开始处)简写即为CR;而后者就叫做Line Feed(Line Feed有行满的意思),简称LF。所以在没有计算机之前,需要同时使用CRLF来表示起一个新行。



答2:


        1中提到的回车和换行可以看做是两个操作,是两个动词,通过两个动作实现了换行,但是当出现计算机后,我们在写文本文件的时候,就需要在一行的结尾处做个标记来指示该换行了,所以Windows系统就沿用了打字机时代的名词,使用“回车符”+“换行符”表示到达当前行的结尾处。然而在计算机发展的早期存储设备相对昂贵,所以有的计算机专家认为用两个字符(回车+换行)表示行尾过于浪费,所以Unix系统只采用了“换行符”,而Mac系统只采用了“回车符”。


        因为'\r','\n'本身是一种语法的表示,所以此处以java语法为背景进行说明,其他语言的含义本质是相似,可类比理解。Java中有8个基本类型,其中一个为char型,而char型的常量有三种表示方式:1.由单引号括起的单个字符;2.由单引号括起的\+字符,例如‘\r’、'\n'、'\t';3.由单引号括起的\u+4位16进制,例如'\u000d','\u000a','\u0009'。其中2类字符表示的含义不再是'\'后的字符本身,而是表示一个新的意思,'\'称作转义字符。由于有的字符能够显示在屏幕上,有的不能,所以需要一种方式来表示那种无法显示在屏幕上的字符,采用转义字符('\')就是为了这个目的。而在我所知道的语言的中,'\r'都表示“回车符”,'\n'都表示"换行符"。所以'\r'、'\n'是回车符和换行符的一种符号表示。


        如果浏览器的控制台中书写如下Javascript代码:alert("我是第一行\n我是第二行"),会看到此行文字分两行显示,读者可自行尝试一下。


\r 表示 mac macos     CR  回车  为什么我的mac macos上的文本文件全是 LF

\n 表示  linux   LF  换行   为什么我的linux 上的文本文件全是 LF

\r\n 表示windows  CRLF  回车换行   我的windows 上的文本文件全是 CRLF



@SunnyRaj 你确定 CR 和 LF 的历史吗?我的印象是,最初 LF 将纸张向前移动一排但不移动打印头,而 CR 移动打印头但不移动纸张。因此,如果您的操作系统在打印之前没有转换输入,您就不能只使用 LF 或 CR 来获得正确的输出。 MS DOS 使用原始打印机数据作为文本文件格式,Mac OS 使用 CR 并将其转换为打印机的原始格式,UNIX 使用 LF 并将其转换为打印机的原始格式。


 

原文链接:https://blog.csdn.net/lunda5/article/details/40963045

 


  • CR 用符号\r表示, 十进制ASCII代码是13, 十六进制代码为0x0D;

  • LF 使用\n符号表示, ASCII代码是10, 十六制为0x0A;




使用Notepad ++,可以显示行尾字符。它显示了CR和LF,而不是“\ r”和“\ n”,

要使用Notepad ++进行此操作,请打开视图菜单,打开显示符号滑出,然后选择“显示所有字符”或“显示换行符”。


               

                   
0收藏0评论0分享                
   
用户回答回答于        

vi(m)中,查看:

:help 'list'
:help 'listchars' 
                   
0收藏0评论0分享            



'\r'是回车,前者使光标到行首,(carriage return)
'\n'是换行,后者使光标下移一格,(line feed)

\r 是回车,return
\n 是换行,newline
对于换行这个动作,unix下一般只有一个0x0A表示换行("\n"),windows下一般都是0x0D和0x0A两个字符("\r\n"),苹果机(MAC OS系统)则采用回车符CR表示下一行(\r)

Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;
Mac系统里,每行结尾是“<回车>”,即“\r”。
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾会多车一个^M字符。
Dos和windows采用回车+换行CR/LF表示下一行,即^M$($不是换行符的表示,换行符没有表示出来,$是文本结束EOF的表示)
而UNIX/Linux采用换行符LF表示下一行,即\n
苹果机(MAC OS系统)则采用回车符CR表示下一行,即\r

CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;
LF使用'\n'符号表示, ASCII代码是10, 十六制为0x0A. 所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.

由于dos风格的换行使用\r\n,把这样的文件上传到unix,有些版本的vi不能识别\r,所以vi显示时在行尾会出现^M出来,但是有些就能识别\r\n,正常显示回车换行



来自  https://blog.csdn.net/qq_34325222/article/details/80783150




我们通常会把应用部署在Linux上,而在使用vi查询应用日志时,可能会发现有一个^M符号,如下所示

  1. [20121121 07:53:19][pool-3-thread-3][AbstractAction]^M 

  2. ------------------------------------------------------------------------------------------^M 

  3. 【通信双方】(0x00004AFE: nio socket, server, /192.168.13.3:59565 => /192.168.12.2:80)^M 

  4. 【收发标识】Receive^M 

  5. 【报文内容】POST /tra/trade/noCardNoPassword.htm HTTP/1.1^M 

  6. Content-Type: application/x-www-form-urlencoded;charset=GB18030^M 

  7. Cache-Control: no-cache^M 

  8. Pragma: no-cache^M 

  9. User-Agent: Java/1.6.0_24^M 

  10. Host: 192.168.20.1^M 

  11. Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2^M 

  12. Connection: keep-alive^M 

  13. Content-Length: 541^M 

  14. ^M 

  15. cooBankNo=CMBC_CREDIT&signType=MD5&amount=499900&orderValidityNum=15&CVVNo=255^M 

  16. ------------------------------------------------------------------------------------------ 

  17. [20121121 16:37:15][pool-3-thread-26][AbstractAction]^M 

  18. ------------------------------------------------------------------------------------------^M 

  19. 【通信双方】(0x0000E522: nio socket, server, /58.83.141.39:60796 => /192.168.12.2:80)^M 

  20. 【收发标识】Receive^M 

  21. 【报文内容】GET /notify_yeepay?p1_MerId=11&r0_Cmd=Buy&r1_Code=1&r2_TrxId=22 HTTP/1.1^M 

  22. Content-Type: application/x-www-form-urlencoded; charset=GBK^M 

  23. Cache-Control: no-cache^M 

  24. Pragma: no-cache^M 

  25. User-Agent: Java/1.5.0_14^M 

  26. Host: 123.125.**.248^M 

  27. Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2^M 

  28. Connection: keep-alive^M 

  29. ^M 

  30. ^M 

  31. ------------------------------------------------------------------------------------------ 

这里就引伸出一个概念:换行符,也就是CR(Carriage Return)和LF(Line Feed)的问题
通常我们在EditPlus——工具——参数设置——文本——新建文件—>>中可以看到PC/UNIX/MAC三种格式
而在UltraEdit——高级——配置——文件处理——新建文件类型——>>中可以看到DOS/UNIX/MAC三种格式
而且UltraEdit在保存文件时也可以指定文件格式:DOS为CRLF,UNIX为LF,MAC为CR
实际上CR(回车符)和LF(换行符)都是用来表示下一行的,只不过各个系统采用的方式不同而已
DOS/Windows系统采用CRLF(即回车+换行)表示下一行
Linux/UNIX系统采用LF表示下一行
MAC系统采用CR表示下一行
注:CR的ASCII是十进制数的13,十六进制的0x0D,LF为10和0x0A

 

多数的计算机语言中,CR表示为字符或者字符串就是"\r",LF为"\n"
而各语言的printf()函数中的"\n"则代表的是一个逻辑上的意义,即当前操作系统中的下一行
所以在UNIX上它代表的是LF,在Windows上则是CRLF

 

另外,HTTP/1.1协议的RFC2616规范中明确说到:
HTTP/1.1将CRLF的序列定义为任何协议元素的行尾标志,但这个规定对实体主体(endtity-body)除外
实体主体(entity-body)的行尾标志是由其相应的媒体类型定义的
于是,可以粗略理解为上面贴出来的HTTP报文中的"【报文内容】"部分(即HTTP请求的原始报文)
它的每一行都是以CRLF结尾的(所以在使用Mina2.x编写HTTP服务器时就可以根据0x0D和0x0A来判断了)

 

最后,回归主题:Linux上的报文尾部出现的^M符号
当使用vi查询日志时,vi内部会认为该日志为Linux格式的,它也只认LF
于是vi就会把遇到的CR干掉,取而代之的就是显示出来一个^M符号

 

下面再引申出来一个关于CR(回车)和LF(换行)的历史,仅供了解
计算机出现之前,是使用电传打字机(Teletype Model 33)打印字符的,它每秒可以打10个字符
但在打完一行后,准备换行时发现,换行需要用去0.2秒,而这0.2秒又正好可以打印两个字符
而如果在这0.2秒期间,又有新的字符传过来,那么传过来的这个字符将丢失,因为它正在换行
于是,研制人员为了解决此问题,就决定在每行后面添加两个表示结束的字符,即CR(回车)和LF(换行)
CR(回车):告诉打字机把打印头重定位在该行的左边界
LF(换行):告诉打字机把打印头下移一行,即把纸向下移一行

接着,随着计算机的发明,这种处理机制也就被移到了计算机上
但当时存储器很贵,有些人认为在每行结尾加两个字符太浪费了,应该加一个就行了,于是乎分歧出现了
DOS/Windows系统采用CRLF(即回车+换行)表示下一行
Linux/UNIX系统采用LF表示下一行
MAC系统采用CR表示下一行

这种分歧导致的直接后果就是:
Windows中打开Linux/UNIX系统下的文件时,所有的文字都会变成一行(因为Windows只认为CRLF才表示换行)
Linux/UNIX中打开Windows系统下的文件时,在每行的结尾可能会多出一个^M符号

而^M符号是Linux等系统规定的一个特殊标记,它占一个字符的大小,它不是^和M的组合,是打印不出来的
并且^M符号也只是用于显示而已,它不会真正的写入到文件中


来自  https://www.linuxidc.com/Linux/2012-11/74725.htm




Linux、Windows 和 Mac 中的换行符对比

原文地址:Linux、Windows 和 Mac 中的换行符对比html        

博客地址:http://www.moonxy.comlinux        

1、前言windows        

常常使用 Window、Linux 等不一样操做系统的开发者,在处理文本的时候,基本都会遇到不一样系统,出现换行格式不一致的问题,缘由就出在不一样的系统,定义了不一样的换行符。服务器        

2、Linux、Windows 和 Mac 中的换行符对比wordpress        

对于换行这个动做,Unix下通常只有一个 0x0A 表示换行("\n"),Windows 下通常都是 0x0D 和 0x0A 两个字符,即 0D0A("\r\n"),苹果机(MAC OS系统)则采用回车符 CR 表示下一行("\r")。spa        

Unix 系统中:每行结尾只有 "<换行>",即 "\n";操作系统        

Windows 系统中:每行结尾是 "<回车><换行>",即 "\r\n";code        

Mac 系统中:每行结尾是 "<回车>",即 "\r"。orm        

不一样系统所定义的换行格式不一样,致使的直接后果是,Unix/Mac 系统下的文件在 Windows 里打开的话,全部文字会变成一行;而 Windows 里的文件在 Unix/Linux 下打开的话,在每行的结尾会多车一个 ^M 字符。htm        

Dos 和 windows 采用 "回车+换行",即 "CR + LF" 表示下一行,即敲一下回车键,至关于同时执行了 "回车+换行",即 ^M$($ 不是换行符的表示,换行符没有表示出来,$ 是文本结束 EOF 的表示)。

而 UNIX/Linux 采用 "换行符",即 "LF" 表示下一行,即 "\n";

苹果机(MAC OS系统)则采用 "回车符",即 "CR" 表示下一行,即 "\r";

CR 用符号 "\r" 表示,十进制 ASCII 代码是 13,十六进制代码为 0x0D

LF 使用 "\n"符号表示,ASCII代码是 10,十六制为 0x0A。因此 Windows 平台上换行在文本文件中是使用 "0D0A" 两个字节表示,而 UNIX/Linux 和苹果平台上换行则分别是使用 0A 和 0D 一个字节表示。

因为 DOS 风格的换行使用 "\r\n",若是把这样的文件上传到 Unix/Linux,有些版本的 vi 不能识别 "\r",因此 vi 显示时在行尾会出现 ^M 出来,可是有些就能识别 \r\n,正常显示回车换行。

附部分 ASCII 码对照表:

       

3、使用 Notepad++ 查看回车和换行符并相互转换        

Notepad++ 中能够设置 Windows、Unix 和 Mac三种行尾换行符格式及其之间的转换,以下:

默认不显示回车及换行符:

       

1)设置 Notepad++ 显示换行符,这样才能看到效果, 视图 -> 显示符号 -> 显示行尾符,若是是英文版的 Notepad++,则应该是 View -> Show Symbol -> Show End of Line;

       

       

2)设置行尾符格式:编辑 ->  档案格式转换 ->(可选 Windows、Unix 和 Mac中的一种),若是是英文版的 Notepad++,则应该是 Edit -> EOL Conversion -> Windows Format、Unix/OSX Format、Old Mac Format。

       

       

4、Linux 中去除 DOS/Windows 文档中出现的 "^$"        

有时候将 Windows 中编辑好的文本上传到 LInux 服务器中使用,此时就须要将 Windows 中的 "^$" 去除,以下:

[root@ryan linux]# ll win1.txt
-rw-r--r-- 1 root root 21 Apr 20 22:09 win1.txt
[root@ryan linux]# cat win1.txt
aaa bbbb
cccc
123
       

使用 cat -A 选项查看文本全部的字符,以下:

[root@ryan linux]# cat -A win1.txt
aaa bbbb^M$
cccc^M$
123^M$

或者使用 cat -v 选项显示出非打印字符,以下:

[root@ryan linux]# cat -v win1.txt
aaa bbbb^M
cccc^M
123^M
       

去除 "^M" 符号,以下:

[root@ryan linux]# cat -v win1.txt | tr -d '^M'  > linux1.txt
[root@ryan linux]# cat -A linux1.txt
aaa bbbb$
cccc$
123$
       

或者使用其 ASCII 码,以下:

[root@ryan linux]# cat win1.txt |tr -d '\015' > linux2.txt
[root@ryan linux]# cat -A linux2.txt
aaa bbbb$
cccc$
123$
       

须要注意:八进制下,^m 是 015;^Z 是 032;tab 是 011;^是136。

此处复习一下进制的相关知识,以下:

在C语言里,整数有三种表示形式:十进制,八进制,十六进制。

其中以数字0开头,由 0~7 组成的数是八进制。以 0X 或 0x 开头,由 0~9,A~F 或 a~f 组成是十六进制。除表示正负的符号外,以 1~9 开头,由 0~9 组成是十进制。

1)十进制:除表示正负的符号外,以 1~9 开头,由0~9组成。如:128,+234,-278。

2)八进制:以 0 开头,由 0~7组成的数。如:0126,050000。

3)十六进制:以 0X 或 0x 开头,由 0~9,A~F 或 a~f  组成。如:0x12A,0x5a000。


来自   http://www.javashuo.com/article/p-fudqczdt-mv.html


https://wenku.baidu.com/view/e79389ae6b0203d8ce2f0066f5335a8102d266ca.html


普通分类: