`
lxz891117
  • 浏览: 33367 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

各操作系统中的换行符差异

 
阅读更多

http://blog.csdn.net/jadyer/article/details/8212067


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

  1. [2012112107:53:19][pool-3-thread-3][AbstractAction]^M
  2. ------------------------------------------------------------------------------------------^M
  3. 【通信双方】(0x00004AFE:niosocket,server,/192.168.13.3:59565=>/192.168.12.2:80)^M
  4. 【收发标识】Receive^M
  5. 【报文内容】POST/tra/trade/noCardNoPassword.htmHTTP/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. [2012112116:37:15][pool-3-thread-26][AbstractAction]^M
  18. ------------------------------------------------------------------------------------------^M
  19. 【通信双方】(0x0000E522:niosocket,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=22HTTP/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符号也只是用于显示而已,它不会真正的写入到文件中


分享到:
评论

相关推荐

    Linux和windows中的换行符差异问题.docx

    标题“Linux和Windows中的换行符差异问题”指的是在Linux和Windows操作系统中,文本文件的换行方式存在差异,导致跨平台操作时可能会遇到显示不正常的问题。在Linux系统中,每行的结束通常只使用一个换行符(LF,...

    java 换行符.docx

    在 Java 中,`BufferedReader` 和 `PrintWriter` 类在读写文件时会自动处理不同操作系统的换行符差异。例如,当你使用 `BufferedReader.readLine()` 读取文件时,它会正确地识别并返回不包含换行符的行内容;而使用 ...

    关于 java中的换行符

    在现代计算机中,这两个概念仍然被保留,但通常已合并为一个单一的换行符,具体形式取决于操作系统。 在Unix/Linux系统中,单个`\n`就足够表示一个换行。而在Windows系统中,需要`\r\n`的组合。Mac OS X 10.0之前的...

    Git处理换行符问题

    首先,你需要知道不同的操作系统对换行符的定义会有所不同,Unix或类Unix操作系统的换行符叫做LF,而windows系统的叫做CRLF,二者具有很大的区别:Unix系统里,每行结尾只有“<换行>”,即"n";Windows系统里面,...

    浅谈mysql数据库中的换行符与textarea中的换行符

    总结来说,理解不同环境下的换行符差异是开发过程中的关键,特别是在数据库与前端交互的场景下。正确处理换行符可以避免文本显示异常,提高用户体验。在实际开发中,开发者还需要考虑到其他可能的换行符变体,例如`\...

    python去除字符串中的换行符

    ### Python去除字符串中的换行符 在Python编程中,经常需要处理文本数据,尤其是在读取文件或接收用户输入时,可能会遇到包含换行符...此外,需要注意不同操作系统之间的换行符差异,以便正确处理来自不同环境的数据。

    对源码自动加上utf8 bom头,并修改换行符为unix换行

    "对源码自动加上utf8 bom头,并修改换行符为unix换行"这个主题涉及了两个关键点:UTF-8 BOM(Byte Order Mark)和换行符的差异。 首先,UTF-8是一种广泛使用的字符编码标准,它能表示Unicode字符集中的所有字符。...

    GIT 换行符自动转换导致整个文件被修改的解决方案

    不同操作系统使用的换行符是不一样的。Unix/Linux使用的是LF,Mac后期也采用了LF,但Windows一直使用CRLF【回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)】作为换行符。而git入库的代码采用的是LF格式,它考虑到了...

    程序+源码 利用python监听剪贴板内容,并去掉换行符 主要用于从cajviewer复制东西的时候把换行去掉

    在给定的标题和描述中,我们关注的是一个特定的应用场景:使用Python来监听剪贴板的变化,并去除复制内容中的换行符。这在处理某些应用,如CAJViewer(中国学术期刊全文数据库的阅读器)时非常有用,因为CAJViewer在...

    UNIX回车换行与Windows下的区别

    在探讨UNIX与Windows文本文件换行符差异之前,我们首先需要理解换行符的基本概念及其在不同操作系统中的实现方式。换行符,简而言之,是在文本文件中用于表示新行开始的特殊字符。然而,不同的操作系统在处理文本...

    解析PHP处理换行符的问题 \r\n

    本文将深入探讨PHP处理换行符的问题,包括`\r`与`\n`的区别,以及在不同操作系统中的表现和转换方法。 首先,`\r`(回车)和`\n`(换行)是两个不同的字符实体。回车起源于早期的电传打字机,它的作用是将打印头...

    PHP中替换换行符的几种方法小结

    在处理文本数据时,经常会遇到需要处理不同操作系统间的换行符差异问题。不同的操作系统使用不同的字符序列作为换行符。例如,Windows 使用 `\r\n`,Unix 和 Linux 通常使用 `\n`,而经典的 Mac OS 使用 `\r`。在 ...

    PHP生成excel时单元格内换行问题的解决方法

    但这些尝试常常不能解决跨平台的兼容性问题,尤其是在不同的操作系统中,比如Windows和Linux对于换行符的处理存在差异。 上述方法未果之后,可以尝试修改HTML代码中的换行符。原本以为是简单的换行问题,却因为...

    C#中正则表达式与回车换行符问题

    开发者需要知道正则表达式中各种特殊字符的意义,如何匹配多行文本,以及如何适应不同操作系统间的换行符差异。通过上述方法,可以提高正则表达式在处理含有回车换行符的文本文件时的适应性和灵活性,从而完成更为...

    unity,windows平台编码问题

    这些问题主要涉及到不同的操作系统之间(如Windows与Unix/MacOSX)的文本文件格式差异,尤其是换行符的不同导致的一系列错误和警告。 #### 二、问题现象 1. **Unity错误提示**: - 错误信息:“Assets/cs”脚本中...

    php去除字符串换行符示例分享

    PHP去除字符串中的换行符是常见的字符串处理操作,特别是在处理文本数据或者用户输入时,常常...需要注意的是,字符串的引用方式(单引号或双引号)以及对不同操作系统换行符的理解,都对实现字符串处理逻辑至关重要。

    lotus domino 开发资料 换行符号

    考虑到跨平台的兼容性,开发者需要了解不同操作系统对换行符的处理方式。Unix/Linux系统通常只使用LF,而MacOS旧版本使用CR。因此,在处理可能在不同平台上运行的应用时,需要注意这些差异。 在Lotus Domino开发中...

    windows和linux、Mac系统换行规则的区别.docx

    为了处理这些兼容性问题,可以使用工具如`sed`来转换文件中的换行符格式,使其适应目标操作系统的标准。例如,使用`sed`命令可以将Windows的CR LF替换为Linux的LF,或者反之。 总的来说,了解这些换行规则的区别...

    php中的PHP_EOL换行符详细解析

    在编程语言中,换行符是一个至关重要的概念,用于在文本字符串中表示新的一行。在PHP中,`PHP_EOL`是一个预定义的常量,用于表示当前操作系统的默认行结束符。这个常量的存在是为了增强代码的跨平台兼容性,因为不同...

Global site tag (gtag.js) - Google Analytics