windows和linux之间传送文本文件,用二进制模式,为何传输后的文件可以正常打开

ajianrelease
  • 199

用winscp将一个文本文件从windonws传到Ubuntu,默认使用的是二进制模式,如下图。传输后,在Ubuntu上用vim可以正常打开,文件中的换行是正常的。传送前后两个文件的md5是相同的

我的疑问是:Windows和Linux的换行符是不同的啊,而且我用的二进制模式传输的,传输过程中应该不会转换换行符啊,那为何在Linux下还可以正常显式呢?

另外,我用winscp又测试了从Ubuntu传送文本文件到windows,也用二进制模式,在windows下也可以正常打开。

图片描述

回复
阅读 9.5k
3 个回答
ajianrelease
  • 199
✓ 已被采纳

在Linux下,可以用cat -A file 看到文件中的所有内容,包括换行符。无论是vim还是Windows上的notepad,Notepad,Notepad++都是支持Linux/Windows上的换行符的,所以从他们的显示来看,你往往看不出文本直接的换行符是什么。也可以用Python做到,用二进制模式打开文件,并用repr()查看,repr()会打印出换行符

liuxinsi
  • 373

难道你的vim没显示^M这种字符?
一般来说在win下的换行符是crlf(\r\n),linux是cr(\n),所以如果你在win下用记事本建一个文本传到linux下打开你应该能在换行那看到^M。
反过来的话理论上你应该在记事本里看到黑块。

更新

根据官网的介绍

In the mode the file is not only transferred, but also converted to format used by the target platform. The mode must not be used for binary files (including document files from modern text processors, like Microsoft Word), as they must be transferred without modification.

还有篇博客

The default behaviour for WinSCP and text files (html, sh, css, pl etc.) is to try and be smart and convert the EOL line character to suit the target and destination operating systems.

所以我觉得是winscp给你转换过了

既然采用的二进制模式,那么文本的内容不会有任何变化。关于换行符,默认window使用\r\n, linux使用\n。在linux下“\r”为不可见字符,所以你看到显示正常。同样你在linux下的文本传到window下,你看到显示正常,这个取决于你使用的编辑器,有些window编辑器能正常处理\n为换行,我记得以前win xp自带的notepad就不能识别\n为换行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏