V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ajianrelease
V2EX  ›  程序员

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

  •  
  •   ajianrelease · 2015-06-14 19:05:36 +08:00 · 6181 次点击
    这是一个创建于 3240 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用winscp将一个文本文件从windonws传到Ubuntu,默认使用的是二进制模式。传输后,在Ubuntu上用vim可以正常打开,文件中的换行是正常的。传送前后两个文件的md5是相同的

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

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

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

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


    如果自带的记事本也能打开的话,估计是微软改进了一下……
    feikaras
        6
    feikaras  
       2015-06-14 19:25:00 +08:00
    再说vim支持dos格式
    再说windows记事本又不支持linux换行。
    ajianrelease
        7
    ajianrelease  
    OP
       2015-06-14 19:37:47 +08:00
    @feikaras 但我实际测试结果是记事本可以正常打开ubuntu传过来的文件,我用的是win7
    ajianrelease
        8
    ajianrelease  
    OP
       2015-06-14 19:39:37 +08:00
    @xupefei 恩,我是用notepad.exe打开的,是正常的
    tonyluj
        9
    tonyluj  
       2015-06-14 20:03:22 +08:00
    和编辑器有关吧,python -c 'print(repr(open("file.txt", "r").read()))',看看原始字符串
    Arthur2e5
        10
    Arthur2e5  
       2015-06-14 20:24:15 +08:00
    为什么不愿意 hexdump 一下……
    从 Ubuntu 传给 Windows 又不说明没有用 Windows 的 CRLF。
    然后稍微专业一点的文本编辑器对付 CR/CRLF/LF 都能自动检测并且看懂。
    ajianrelease
        11
    ajianrelease  
    OP
       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
        12
    vibbow  
       2015-06-14 20:39:59 +08:00
    @ajianrelease 那只能说是python有问题...
    endrollex
        13
    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
        14
    ajianrelease  
    OP
       2015-06-14 20:43:30 +08:00
    @Arthur2e5 哈,好办法,查看过了,文件传输前后没有修改。谢谢啦
    ajianrelease
        15
    ajianrelease  
    OP
       2015-06-14 20:44:28 +08:00
    @endrollex 好办法,感谢
    zhicheng
        16
    zhicheng  
       2015-06-14 20:54:22 +08:00 via Android
    看到 md5 是一样的,后面就没必要讨论了。
    tonyluj
        17
    tonyluj  
       2015-06-14 20:59:57 +08:00
    额 我测试了下,在Windows下用记事本创建 hello换行world,实际的文件是hello\nworld,12个字节,python木有问题~
    caixiexin
        18
    caixiexin  
       2015-06-14 22:38:48 +08:00
    先看下编辑器有没有偷偷帮你转好了再展示? vim的话,看下右下角那个dos或者unix标记?
    regeditms
        19
    regeditms  
       2015-06-14 22:41:49 +08:00
    二进制模式都似乎正常的,如果用文本模式写入就会有问题.
    secondwtq
        20
    secondwtq  
       2015-06-14 22:58:14 +08:00
    @vibbow 如果我没有记错的话,学校 C 语言课里面教的 fopen 第二个参数的 'b' 选项,就是 Windows 专属。

    也就是说如果在 Windows 环境下,不带 'b' 选项打开一个文件(所谓“文本模式”),可能你读到的内容已经被动了手脚。
    msg7086
        21
    msg7086  
       2015-06-15 00:18:46 +08:00
    (谁告诉你不能正常打开的)
    feikaras
        22
    feikaras  
       2015-06-15 01:13:19 +08:00
    @ajianrelease 问题是linux也可以保存成dos模式。自己看下编辑器。
    ryd994
        23
    ryd994  
       2015-06-15 02:37:17 +08:00
    可能是ftp分二进制模式和文本模式,文本模式下自动转换了
    withrock
        24
    withrock  
       2015-06-15 10:04:23 +08:00
    建议都用二进制传输。有时候会遇到Windows下的文件传输到linux下后用vi打开,看到许多^M符号。只能
    :%s/^M//g了
    caoyue
        25
    caoyue  
       2015-06-15 10:42:09 +08:00   ❤️ 1
    为什么你会觉得文本内容会没法正常打开……
    notepad.exe 是只能把 CRLF 识别为换行,但是不代表不能识别其他内容啊
    你用 notepad.exe 打开 LF 换行的文件,只是会出现所有内容不变,但是挤在一行
    ajianrelease
        26
    ajianrelease  
    OP
       2015-06-15 16:08:06 +08:00
    @caixiexin 感谢,我用:set ff看了下,是DOS文件格式
    ajianrelease
        27
    ajianrelease  
    OP
       2015-06-15 16:08:47 +08:00
    @withrock 这个建议很好,话说又学了一招,谢谢
    walleL
        28
    walleL  
       2015-06-15 16:52:06 +08:00
    没人说用 cat -A file 看看?
    ajianrelease
        29
    ajianrelease  
    OP
       2015-06-15 18:29:37 +08:00
    @walleL 牛啊,原来还有这么好的命令,简直是照妖镜啊,直接让换行符再原形了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3790 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 04:17 · PVG 12:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.