最近在一个项目中,经常性的出现异常问题,原来的需求是用java通过字符转成十六进制来处理数据,用”434C530A“来分割字符处理的,但是在日志中却发现不存在“434C530A“,而是“434C530D0A”,难怪咯,因为是通过\n换行符来处理的,而异常的数据是多了一个\r\n。
\r \n \r\n区别
这三个到底有什么区别呢?查阅相关资料如下。
”\r" 是回车,使光标到一行的首位,return的缩写(carriage return)
"\n" 是换行,使光标下移到一格 newline的缩写(line feed)
根据ASCII码对照表,
换行键是"\n",缩写:LF,十六进制:0A,十进制:10
归为键是"\r",缩写:CR,十六进制:0D,十进制:13
这样就很好的解释了为什么分割的字符串是:0D0A了,前端处理的换行符加的是 \r\n;结果导致问题的发生。
n 和 r差异
'r'是回车,'n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。有的编辑器只认rn,有的编辑器则两个都认。所以要想通用的话,最好用rn换行。
Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;
Mac系统里,每行结尾是“<回车>”,即“\r”。
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾会多车一个^M字符。