windows 和 linux 之间传送文本文件,用二进制模式,为何传输后的文件可以正常打开? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ajianrelease
V2EX    程序员

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

  •  
  •   ajianrelease 2015-06-14 19:05:36 +08:00 6681 次点击
    这是一个创建于 3771 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用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     Solana     5489 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 08:32 PVG 16:32 LAX 01:32 JFK 04:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86