最近在一个项目中,经常性的出现异常问题,原来的需求是用java通过字符转成十六进制来处理数据,用”434C530A“来分割字符处理的,但是在日志中却发现不存在“434C530A“,而是“434C530D0A”,难怪咯,因为是通过n换行符来处理的,而异常的数据是多了一个rn。

r n rn区别

这三个到底有什么区别呢?查阅相关资料如下。

”r" 是回车,使光标到一行的首位,return的缩写(carriage return)
"n" 是换行,使光标下移到一格 newline的缩写(line feed)

根据ASCII码对照表,

换行键是"n",缩写:LF,十六进制:0A,十进制:10
归为键是"r",缩写:CR,十六进制:0D,十进制:13

这样就很好的解释了为什么分割的字符串是:0D0A了,前端处理的换行符加的是 rn;结果导致问题的发生。

n 和 r差异

'r'是回车,'n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。有的编辑器只认rn,有的编辑器则两个都认。所以要想通用的话,最好用rn换行。

Unix系统里,每行结尾只有“<换行>”,即“n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“rn”;
Mac系统里,每行结尾是“<回车>”,即“r”。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾会多车一个^M字符。