“换行”与“回车”
在处理Android的bootanimation.zip文件时,压缩包里有一个desc.txt文件,而制作该zip包时,总喜欢在windows系统下制作打包,但将其push到android系统相应的/system/media/目录下后,修改了该文件的访问权限,重启下android后,Logo呢?一片漆黑。太伤心了,查找了一下,从网下下载了一个zip包,同样操作,都可以正常显示,为什么呢?只能比对查找一下,发现网上的zip包使用windows下打开其中的txt文件,都是显示在一行的,而我自己做的打开后都是换行了,故而在linux下打开,发现网上的没有异常显示,都是换行的,而我的打开后,在每行后面多了个^M符号,纠结,继续查找,终于发现了隐含其中的秘密:“回车”、“换行”,这两者有区别吗?在上学时,高中老师就跟我们说是一样的,于是怀着深信不疑的态度,继续纠结着。直到今天,不行,我必须解开这秘密了。于是总结如下:
1、曾经的历史
在计算机出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符,不过它有一个问题是打完一行字符换行的时候,要用去0.2秒,这正好够打两个字符。如果在这0.2秒里,又有新的字符传过来,那么这些新传过来的字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。
2、今天的区别
而电传打字机的处理方式被引入计算机系统,在计算机刚发明之初,由于存储器太贵,不同的专家对于在一行后面加CRLF两个字符觉得太浪费,加一个就可以了,于是有了如下的三分天下处理:
OS | 功能符 | C语言表示 | 16进制表示 |
Windows | 回车+换行(CR+LF) | \r\n | 0x0d0a |
Linux/Unix | 换行符(LF) | \n | 0x0a |
MAC | 回车符(CR) | \r | 0x0d |
从表格一看,一切问题都清楚了,其中CR对应CTRL+M,而LF对应CTRL+J。在windows下编程打开文件时,有以“文本”、“二进制”的形式打开文件,而此时,以“文本”(即ASCII码)打开时,回车换行符会识别为LF,而以“二进制”方式则会识别为CRLF,故而在网络传输时更需要注意需要以“二进制”的方式传输数据,以适应多平台处理,屏蔽平台差异。
3、为何叫CRLF
CR:Carriage Return,回车,0x0d;
LF:Line Feed,换行,0x0a。