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

2015-06-14 19:05:36 +08:00
 ajianrelease
用winscp将一个文本文件从windonws传到Ubuntu,默认使用的是二进制模式。传输后,在Ubuntu上用vim可以正常打开,文件中的换行是正常的。传送前后两个文件的md5是相同的

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

另外,我用winscp又测试了从Ubuntu传送文本文件到windows,也用二进制模式,在windows下也可以正常打开。
6365 次点击
所在节点    程序员
29 条回复
vibbow
2015-06-14 19:10:19 +08:00
windows: \r\n
linux: \n

反正都有 \n,linux当然能正确换行了
\r 也不会破坏什么东西

Windows下取决于编辑器,你用windows自带记事本打开看看。
haiyang416
2015-06-14 19:10:22 +08:00
你不认为你用什么工具打开也很重要么?
ajianrelease
2015-06-14 19:17:48 +08:00
@vibbow 用Windows自带的记事本也可以正常打开
icylogic
2015-06-14 19:18:49 +08:00
因为 vim 可以按照 dos 模式显示的啊
xupefei
2015-06-14 19:21:06 +08:00


如果自带的记事本也能打开的话,估计是微软改进了一下……
feikaras
2015-06-14 19:25:00 +08:00
再说vim支持dos格式
再说windows记事本又不支持linux换行。
ajianrelease
2015-06-14 19:37:47 +08:00
@feikaras 但我实际测试结果是记事本可以正常打开ubuntu传过来的文件,我用的是win7
ajianrelease
2015-06-14 19:39:37 +08:00
@xupefei 恩,我是用notepad.exe打开的,是正常的
tonyluj
2015-06-14 20:03:22 +08:00
和编辑器有关吧,python -c 'print(repr(open("file.txt", "r").read()))',看看原始字符串
Arthur2e5
2015-06-14 20:24:15 +08:00
为什么不愿意 hexdump 一下……
从 Ubuntu 传给 Windows 又不说明没有用 Windows 的 CRLF。
然后稍微专业一点的文本编辑器对付 CR/CRLF/LF 都能自动检测并且看懂。
ajianrelease
2015-06-14 20:33:49 +08:00
@tonyluj 在Linux下是'hello,baby\r\nhehe\r\n',在Windows下是'hello,baby\nhehe\n'。两个文件的md5是相同的,但Windows下没有打印出那个\r
vibbow
2015-06-14 20:39:59 +08:00
@ajianrelease 那只能说是python有问题...
endrollex
2015-06-14 20:42:12 +08:00
ASCII中的定义:
换行: LF(Line feed), '\n', 0x0A, 10 in decimal)
回车: CR(Carriage return, '\r', 0x0D, 13 in decimal)
回车+换行: (CR+LF, '\r\n', 0x0D0A)

看十六进制,ASCII定义可能有变
ajianrelease
2015-06-14 20:43:30 +08:00
@Arthur2e5 哈,好办法,查看过了,文件传输前后没有修改。谢谢啦
ajianrelease
2015-06-14 20:44:28 +08:00
@endrollex 好办法,感谢
zhicheng
2015-06-14 20:54:22 +08:00
看到 md5 是一样的,后面就没必要讨论了。
tonyluj
2015-06-14 20:59:57 +08:00
额 我测试了下,在Windows下用记事本创建 hello换行world,实际的文件是hello\nworld,12个字节,python木有问题~
caixiexin
2015-06-14 22:38:48 +08:00
先看下编辑器有没有偷偷帮你转好了再展示? vim的话,看下右下角那个dos或者unix标记?
regeditms
2015-06-14 22:41:49 +08:00
二进制模式都似乎正常的,如果用文本模式写入就会有问题.
secondwtq
2015-06-14 22:58:14 +08:00
@vibbow 如果我没有记错的话,学校 C 语言课里面教的 fopen 第二个参数的 'b' 选项,就是 Windows 专属。

也就是说如果在 Windows 环境下,不带 'b' 选项打开一个文件(所谓“文本模式”),可能你读到的内容已经被动了手脚。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/198493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX