回车和换行

线上遇到一个问题:一个页面的所有js都失效了!通过浏览器控制台也没发现js报错。用Charles把页面响应保存下来。一段代码一段代码删除做减法。发现是类似下面的一段:
var temptitle = "纳雪莱 蔑藤竹炭竹垫 汽车坐垫四季垫 夏季通用 汽车用品
 A6410";
字符串有内有换行,可是光有换行应该也没问题啊,于是在notepad++中显示了所有字符,问题浮出水面!“汽车用品”后面的是LF,而不是CRLF! 20130419140345 这个bug是如何引入和如何修复的不是这篇文章我要说的重点(temptitle这条语句是后台拼出来的,字符串内容是用户从textarea输入的,程序没有对输入做足够的校验处理,所以出现了这个意外。),我在这想说说的是这个CR和LF(回车和换行)。

一、历史

这两个字符的历史可以追溯到计算器出现之前,有一种叫 电传打字机的东西,他可以理解为高级的电报,可以接受电信号,转换成字符打印到纸上。设计的时候遇到一个问题,当打印完一行,机械的打印头是在行尾的。要打印下一行,就必须将打印头从行尾移到行头(回车),并向下移一行(换行)。 唐纳德·穆雷想出的解决方法是传输两个控制字符(CR = Carriage Return  和 LF = Line Feed)来告诉打字机执行这两个动作。这个设计被保留到了计算机的时代。

二、各操作系统间的差异

在那个存储器还非常昂贵的是年代。一些科学家认为,每行结尾都用两个字符来表示是一件非常奢侈的事情。应该用一个字符就够了。于是分歧出现了。unix采用了\n这个字符,mac采用\r,而windows依然使用\r\n。
操作系统 采用的字符
操作系统 缩写 英文 转义字符 ASCII 码 16进制
Windows CRLF Carriage Return Line Feed \r\n 13 10 0x0D 0x0A
Unix/Linux LF Line Feed \n 10 0x0A
Mac OS CR Carriage Return \r 13 0x0D

三、在不同的操作系统间打开文件

从上面的表我们可以看到,不同的操作系统使用的“行分隔符”不一样,所以同一个文件(比如源代码文件),在不同的操作系统下使用文本编辑器打开,换行的表现不一定正确。为了保证一份文件在不同的操作系统间打开,看起来来都是一样的。我们有时需要对文件的换行符进行处理。 在windows下,我一般使用notepad++,他可以正确的将\n显示成换行(看上面截图)。也可以对文件进行转换:编辑->档案格式转换->你想要的格式。在新建文件的时候,也允许你选择格式: 回车和换行_第1张图片 在linux下,可以采用工具 dos2unix和unix2dos来进行互相转换。当然也可使用sed自己做替换。 作为屌丝的我,居然没怎么用过macOS,就不在个瞎说了。各位用过的请脑补。不过貌似上面提到的dos2nuix就可以了。

四、对码农的影响

我们的源代码通常都是会在好几个操作系统间来回流转的,比如我们的源码服务器是windows,开发机器是linux或者反过来。所以这里也涉及到这个问题,只不过大多数情况下我们的版本管理工具(svn或git等等)已经默默的帮你把事情都搞定了。所以你浑然不觉而已。其实在安装windows下的git客户端时,是有一个提示的: 回车和换行_第2张图片 在这里你可以选择git在checkout和commit的时候,如何处理换行符。

你可能感兴趣的:(换行符,CRLF)