在找虫的过程中发现如果把有问题的文件重新保存一次,报错消失。并且对比前后两次的文件大小,有1字节的差异。
这1字节应该就是关键。要看下两个文件这1字节差在哪里,需要查看文件的字节码
在终端输入 vi -b 文件名,使用二进制模式
进入后输入
:%!xxd
文件的字节码(对应ASCII码表)就展开了。
窗口右边的字符是一一对应的
左边的文件是有问题的,右边的可以成功解析。
差别就在于右边文件,所有的换行符都是 0d 0a ,对应 ASCII 码表是“回车”+“换行”。
但是左边文件,倒数第二行的换行符只有0a,即只有“换行”。
结合之前在源码中打印错误行解析为 [ ..., '0.6\n1683142', ... ],换行符被和前后文一起合在一起了,确定是这个差异导致了行解析错误。
那么在文件中什么换行才是正常的呢?
这里摘录一下阮一峰大佬《回车和换行》里的解释( http://www.ruanyifeng.com/blog/2006/04/post_213.html)
Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";
Mac系统里,每行结尾是"<回车>"。
Unix系统里,每行结尾只有"<换行>",即"\n";
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
基本可以下结论,QA小姐姐的这份文件应该是在多个系统环境下经历了修改保存,产生的换行格式差异导致的问题。