各操作系统中的换行符差异
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符号也只是用于显示而已,它不会真正的写入到文件中
我来说两句