PS:今天遇到一个文件转换问题,现在将网上搜索到资料贴出来。。

第一个资料

Windows/DOS与Unix文件格式是不同的,问题一般就是出在/r/n问题上。

回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:Dos和windows采用回车+ 换行(CR+LG)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。当在不同的系统间传递文件,就要涉及格式的转换。

先搞清楚几个符号


0D CR ^M 回车


DOS/Windows文本文件中使用CR(回车\r)和 LF(换行\n),

在文件的行尾的情况是是 '\r\n'

UNIX文本只使用换行符,在行的末尾有一个换行(\n),也就是'\n'

所以在windows下编辑的C程序放在unix下编译会出现"No end of newline"的Warning

两种文件格式之间的转化

Unix -> Dos
'\n' -> '\r\n'
Unix -> Dos
'\n' -> '\r\n'
while ( (ch = fgetc(in)) != EOF )
{
if ( ch == '\n' )
putchar('\r');
putchar(ch);
}

只要在Unix文件中出现的'\n'的之前加入一个'\r'字符就可以了

Unix <- DOS

'\n' <- '\r\n'

从Dos到Unix的情况复杂点,不能只是把从文件中读出的'\r'去掉就可以了

因为Dos文件中的文本行的末尾有时会内嵌一个回车符号,这种情况在击打式打印机中出现。

所以在转换前要判断'\r'是否和'\n'同时出现。

如果同时出现,则去掉'\r'

如果没有同时出现,保留'\n'

//

    cr_flag = 0;  /* No CR encountered yet */
while ( (ch = fgetc(in)) != EOF )
{
if ( cr_flag && ch != '\n' ) {
/* This CR did not preceed LF */
putchar('\r');
}
if ( !(cr_flag = (ch == '\r')) )
putchar(ch);
}

第二个

服务器端

无论在

但这并不是说在服务器端存储的文件(以 ,v结尾),不能包含字符“0d”。比如二进制文件中很多包含字符0d。文本文件也可能包含0d,但大部分包含0d的文本文件,很有可能是由于不当的跨平台使用cvs造成的。

服务器端的这种处理方法很好的适应了跨平台特性。亦即unix端服务器的repository 可以直接拷贝到windows端的repository中,vice versa。

在将unix维护的服务器端,移植到windows端,我曾经遇到一个百思不得其解的问题。后来发现是由于winzip的一个古怪的缺省设置造成的:“tar file smart cr/lf conversion”!

unix 客户端

unix上的客户端文本原样存储保存到服务器端,0d作为普通字符随文件checkin,因为 unix的默认文件换行符为 “0a”。

第三个

Windows & Unix 文件格式之谜

\1. 问题提出:

我们可能会遇到过这样一些困惑:

(1) 如何查看一个文件或数据流的二进制格式(以十六进制格式显示)?

(2) 为什么在 windows下编译的 shell 脚本在 Unix下不能执行?

为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译?

(3) 为什么我在 vi 等编器下打开一个文本文件会包含 ^M, 如何把它去掉?

为什么我在 windows 上用记事本打开 unix上的文件, 文件都不换行?

(4) 如何删除文件行尾的 空格 或 tab?

如何把文件中的 tab 转换成 空格, 或者把 空格 转换成 tab?

如何只转换行首 tab 转换成 空格?

...

\2. 分析与方案:

(1) 如何查看一个文件的二进制格式(以十六进制格式显示)?

查看任意文件或数据流的二进制格式, 我们非常常用.

方法一: 在 UtraEdit 使用 Ctrl + H 切换到十六进制编辑模式.

** 注意 ** :

此方法一有缺陷, 它会将行末的单个"换行符"显示成 "回车" + "换行" 两个字符.

这样会使问题 (2)(3)(4) 无法用此工具正确查看.

方法二: 使用文件或流的二进制查看工具 fbin

fbin 可以运行于 windows 和各种 Unix 平台,

如下例的命令显示文件的前48字节:

  $ fbin xx.c 0x30
filename: 'xx.c'
filelen : 0x68(104), offset: 0x38, max output: 0x30
00000000: 2369 6E63 6C75 6465 3C73 7464 696F 2E68 #include....intmain()..
00000020: 7B0D 0A20 2020 2063 6861 7209 2020 2020 {.. char. fbin 能准确显示文件中的每一个字节. (更多详细实例见后文)

(2) 为什么在 windows下编辑的 shell 脚本在 Unix下不能执行?

为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译?

原因分析:

unix 的 shell 脚本不能识别 "回车符" (即: CR, '\r'),

Windows 文件格式(详细分析见下文) 换行时, 总是以 "回车" + "换行"

(可以借助上一问介绍的 fbin 工具, 查看文件中是否包含 "回车换行" 对),

导到 unix 下的 shell 无法正常解释.

解决方法:

就是把 windows 格式的中的 "回车" 符删除, 删除.

方法一: 使用 vi 打开源文件, 把 '\r\n' 替换成 '\n'

** 缺点 ** : 不适合大量文件的批量作业.

方法二: 使用 UtraEdit 把 Windows 格式的文件转换成 Unix 格式.

(菜单)文件-->转换-->Unix转DOS

** 缺点 ** : 不适合大量文件的批量作业.

方法三: Unix 下的 dos2unix 命令, 如 $ dos2unix -k xx.c

** 缺点 ** :

此方法有一致命缺陷, 它会改变原来的文件属性.

如一个可执行 shell 脚本的可执行属性及其它属性, 转换后都将会丢掉

(即使用 -k 也只是能保留住原来的日期.)

** 优点 ** : 适合大量普通文件本文件的批量作业.

方法四: win2unix (windows, unix 均可使用), 功能类似 dos2unix,

如 win2unx xx.c (更多详细实例见后文)

** 优点** :

克服了 dos2unix 的所有缺点(见上), 它能保留源文件的任何属性.

还可以返回转换即 unix2win

适合大量文件的批量作业.

(3) 为什么我在 vi 等编器下打开一个文本文件会包含 ^M, 如何把它去掉? (见结论 4, 5)

为什么我在 windows 上用记事本打开 unix上的文件, 文件都不换行? (见结论 1)

原因分析:

要解决这个问题, 必先弄清 unix 与 windows 文本文件的差异:

1) 磁盘中 Windows 文本文件总是以 "回车" + "换行"的形式进行换行的.

2) 磁盘中 Unix 格式的文本文件, 总是以"换行符"(即: LF, '\n') 换行, 而非 "回车换行符".

(Unix 规定: unix 文本文件保存到磁盘时, 总是自动把 "回车换行符" 转换成 "回车符" 保存,

输出到终端时由终端自动将将 "回车符" 转换成 "回车换行符" 输出.)

  ** 容易看出 **:
Windows 格式的文件换行时, 总是比 Unix格式的文件多一个 "回车" ('\r') 符. ** 结论 1 **:
这样在 windows 的记事本中打开 Unix 格式的文件时, 因为文件中没有 '\r', 所以无法正常显示.
结果就会把所有的内容显示在同一行中. ** 结论 2 **:
UtraEdit 等工具会自动检测文件中是否包含 '\r', 当检查行末缺少 '\r'时, 一般它会提示
要求进行 Unix 到 Windows 格式的转换. (相信大家都遇到这个提示信息). ** 结论 3 **:
UtraEdit 和 vi 等工具, 在保存文件时会自动依照文件原来的格式进行保存. 即:
如打开的如是 windows 格式它会把文件依然按 windows 格式保存 (不进行自动转换).
如打开的如是 unix 格式它会把文件依然按 unix 格式保存 (不进行自动转换). ** 结论 4 **:
向 UtraEdit 打开的 Unix 格式文件中, 通过粘贴板 "粘贴" Windows 格式的若干片断行时
(或反之, 即向 Windows 格式文件中, 通过粘贴板 "粘贴" Unix 格式的若干片断行时),
代码片断中的 "回车换行符" "不会" 自动转换成单个 "换行" 符(反之亦然).
这样, 该文件中就会出现 "回车符" 与 "回车换行符" 互相夹杂.
即, 文件中既有单独的 "回车符" 也有 成对的 "回车换行符". ** 结论 5 **:
vi 编辑器等, 既能正确显示"规则"的 Unix 格式文件, 也能正确显示"规则"的 Windows 格式文件,
但, 对包含单独的 "回车符", 同时成对的 "回车换行符"的不规则文件 (产生原因见结论 4),
vi 将把回车符以 ^M 的形式显示.

解决方法:

使用类似问题 2 提供的解决方法即可解决, 不再骜述.

将 unix 转换成 Windows 格式时, 使用 unix2dos 或 win2unix -r(-r 代表反方向)即可.

(4) 如何删除文件行尾的 空格 或 tab?

如何把文件中的 tab 转换成 空格, 或者把 空格 转换成 tab?

如何只转换行首 tab 转换成 空格?

问题分析:

出于各种需要, 特别是编辑 C/C++, Java 等源程序时, 常希望将源文件中的 tab 成空格,

或将空格转换成 tab, 同时删除行尾不必要的空格或 tab 等.

如果源程序的正文中字符串中包含"空格"或"tab"时, 则只希望只转换行首的"空格"或"tab".

解决方法:

如果是单个文件, 直接使用一些编辑器自带的转换功能转换.

如果是想批量转换, 不防试试 tab2sp 进行转换, 不仅适合批量文件, 还适合数据流.

方法一: 使用 UtraEdit 的转换功能, 即: (菜单)格式-->转换 TAB 为空格, ...

** 缺点 **:

不适合大量文件的批量作业.

方法二: tab2sp (适合 windows, 各种 unix 平台),

如 tab2sp -t -w8 xx.c (更多详细实例见后文)

  ** 优点 **:
适合大量文件的批量作业.
适应文件或流的二进制查看工具 fbin

\3. 工具详解: fbin, win2unix, tab2sp 等对流或文件进行批量查看/转换

(1) 工具简介

fbin, win2unix, tab2sp 等工具对流或文件进行批量查看/转换,

适合 Windows 和 各种 Unix 平台.

(2) fbin - 查看流/文件的二进制格式

在命令行上键入下面命令即可查看在线帮助(部分内容未列出)

$ fbin --help

fbin - display file with hex format, version 1.0.4

Copyright(C) eyBuild Group, 2005, 2006. All Rights Reserved.

[url=http://www.eybuild.com/][color=#000000]http://www.eybuild.com[/color][/url], [url=mailto:eybuild@hotmail.com][color=#000000]eybuild@hotmail.com[/color][/url]

Usage: fbin [options] [fname [0x][offset] [maxlen] | [file1] ...]

-h --help - show this help

-w[num] - specify word-width [2/4], default 2

-p - pause for every screen

-v - verbose mode

-l - process file list replace 'fname' ...

fname - file name to display

offset - hex number, '0x' is optional.

offset >= 0 from the begining of input file,

offset for /F %I in ('dir /w /b /s /A:-D eybuild\bin') do fbin -w2 -v -l %I | more

(3) win2unix - Windows 与 Unix 文件格式互转换工具

在命令行上键入下面命令即可查看在线帮助(部分内容未列出)

$ win2unix --help

win2unix - translate file between windows and unix format, version 1.0.5

Usage: win2unix [options] [[src] [dst] | [file1] ...]

-h --help - show this help

-r - translate file from unix format to windows

-v - verbose mode

-l - process file list replace 'src' & 'dst' pair

src - source file or dectory

dst - destination file or dectory

EXAMPLES:
win2unix foo.txt
convert unix to windows format:
win2unix -r -b src.txt dst.txt
process file list:
win2unix -v -l f1 f2 f3 f4 f5 f6

例1. Unix 格式转换成 Windows 格式:

$ win2unx -r fbin.c

查看二进制结果如下, 与fbin中的"例1"对比容易发现, 第3行中原来的0A0A(两个"换行符")
被转换成了 0D0A0D0A (两对"回车换行符").
$ fbin fbin.c 0 40
00000000: 2F2A 2066 6269 6E2E 6320 2D20 6C69 7374 /* fbin.c - list
00000010: 2066 696C 6520 7769 7468 2062 696E 6E61 file with binna
00000020: 7279 2066 6F72 6D61 7420 2A2F 0D0A 0D0A ry format */....
00000030: 2F2A 2043 6F70 7972 6967 6874 2843 2920 /* Copyright(C)

例2. Windows 格式转换成 Unix 格式:

$ win2unx fbin.c

查看二进制结果如下, 与 "例1"对比容易发现, 第3行中原来的0D0A0D0A (两对"回车换行符")
被转换成了 0A0A(两个"换行符")
$ fbin fbin.c 0 40
00000000: 2F2A 2066 6269 6E2E 6320 2D20 6C69 7374 /* fbin.c - list
00000010: 2066 696C 6520 7769 7468 2062 696E 6E61 file with binna
00000020: 7279 2066 6F72 6D61 7420 2A2F 0A0A 2F2A ry format */../*
00000030: 2043 6F70 7972 6967 6874 2843 2920 6579 Copyright(C) ey

例3. 批量转换查找(包含子目录)到的所有文件:

$ find src -name "*.c" | xargs win2unix -l -v

convert 'win' to 'unix' format ...

src/csp2bin.c

src/tab2sp.c

src/fbin.c

src/win2unix.c

...

Windos 命令如下命令, 会得到相同结果:
E:\> for /F %I in ('dir /w /b /s /A:-D src/*.c') do win2unix -v -l %I

(4) tab2sp - tab 与 空格的互转换

在命令行上键入下面命令即可查看在线帮助(部分内容未列出)

$ win2unix --help

tab2sp - convert tabs to spaces or revert, version 1.0.2

Usage: tab2sp [options] [[src] [dst] | [file1] ...]

-h --help - show this help

-r - convert spaces to tabs

-p - only convert line prefixed spaces or tabs

-t - remove tail tabs and spaces

-w[num] - specify tab width [1-8], default 4

-no - don't do any convert

-v - verbose mode

-l - process file list replace 'src' & 'dst' pair

src - source file

dst - destination file

Windows/DOS与Unix文件格式之间的相互转换(/r/n问题)的更多相关文章

  1. dos与unix文件格式之间的转换

    1. VI编辑器中转换 在VI中使用命令 set ff?(fileformat)可以查看文件的格式,使用set ff=dos(unix)可以设置文件的格式 2.使用sed处理(来至http://www ...

  2. DOS和UNIX文本文件之间相互转换的方法

    在Unix/Linux下可以使用file命令查看文件类型,如下: file dosfile.txt 使用dos2unix 一般Linux发行版中都带有这个小工具,只能把DOS转换为UNIX文件,命令如 ...

  3. DOS、Mac 和 Unix 文件格式+ UltraEdit使用

    文件格式 区分DOS.Mac 和 Unix分别对应三种系统 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种 文件模式 区分ASCII模式和Binary模式  通常由系统决定,大多数 ...

  4. DOS、Mac 和 Unix 文件格式[转]

    DOS.Mac 和 Unix 文件格式 相信很多朋友都碰到过这三种文件格式的互换问题,今日又碰到这个问题,忽然想寻根问底,于是整理了本文档. 文件格式区别   我们先看看这三个家伙有啥区别.很久以前, ...

  5. DOS文件转换成UNIX文件格式详解

    转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...

  6. 【改】DOS文件格式转UNIX文件格式

    windows中的文本文件的换行符是"\r\n",而linux中是"\n",dos格式文件传输到unix系统时,会在每行的结尾多一个^M,当然也有可能看不到,但 ...

  7. dos文件格式转换为Unix文件格式

    做linux开发的,一般还是在windows上装个虚拟机,在windows上开发, 所以就会出现dos文件与unix文件格式不一致,当windows上的文件在linux上用的时候,经常在每行的末尾会出 ...

  8. DOS & UNIX文件格式转换

    1.使用vi编辑器 vi xxxx :set fileformat=unix(or dos) :wq 2.使用 dos2unix 这个只能把DOS转换成UNIX文件 . sudo apt-get in ...

  9. windows dos命令大全

    windows dos命令大全 一.windows DOS命令概述 Windows的dos命令又是Windows的CMD命令.而cmd命令又是原来MS-DOS系统保留下来. DOS来源路径与配置对应的 ...

  10. 转载自CSDN,结论:windows下按ENTER键应该是\r\n ascii码为 13 10

    记得在Windows下学X86汇编语言时,用0DH(\r)和0AH(\n)来输出回车(跳到下一行的开始处).问题来了,在Windows下是 先回车再换行呢还是先换行再回车呢?在Unix系统下换行只有\ ...

随机推荐

  1. 四月二十六java基础知识

    1..对文件的随机访问:前面介绍的流类实现的是磁盘文件的顺序读写,而且读和写分别创建不同的对象,java语言中还定义了一个功能强大.使用更方便的随机访问类RandomAcessFile它可以实现文件的 ...

  2. DG:模拟failover故障与恢复

    问题描述:情形是当主库真正出现异常之后,才会执行的操作,那么我们执行过failover 之后,如何在重新构建DG,这里我们利用flashback database来重构.模拟前主库要开启闪回区,否则要 ...

  3. 生产事故-走近科学之消失的JWT

    入职多年,面对生产环境,尽管都是小心翼翼,慎之又慎,还是难免捅出篓子.轻则满头大汗,面红耳赤.重则系统停摆,损失资金.每一个生产事故的背后,都是宝贵的经验和教训,都是项目成员的血泪史.为了更好地防范和 ...

  4. MKL稀疏矩阵运算示例及函数封装

    Intel MKL库提供了大量优化程度高.效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装 ...

  5. [Pytorch框架] 2.5 循环神经网络

    文章目录 2.5 循环神经网络 2.5.1 RNN简介 RNN的起因 为什么需要RNN RNN都能做什么 2.5.2 RNN的网络结构及原理 RNN LSTM GRU 2.5.3 循环网络的向后传播( ...

  6. 你知道Object类和Objects的常用方法吗

    文章目录 Object的常用方法 Objects的常用方法 hashCode hash isNull equals requireNonNull compare nonNull 大家好,Leo又来了! ...

  7. SQL语句获取数据表结构定义,适合导出EXCEL为文档

    SELECT 表名 = Case When A.colorder=1 Then D.name Else '' End, 表说明 = Case When A.colorder=1 Then isnull ...

  8. 数据库定时备份winserver2012篇

    目录 1 序言 2 任务计划相关知识点介绍 2.1 任务计划 是什么? 2.2 批处理文件 2.2.1 批处理文件简介 2.2.2 批处理常用命令介绍 3 各个数据库备份脚本 3.1 Oracle数据 ...

  9. 2022-08-09:以下go语言代码输出什么?A:否,会 panic;B:是,能正确运行;C:不清楚,看投票结果。 package main import ( “fmt“ “syn

    2022-08-09:以下go语言代码输出什么?A:否,会 panic:B:是,能正确运行:C:不清楚,看投票结果. package main import ( "fmt" &qu ...

  10. 2021-01-31:Redis集群方案不可用的情况有哪些?

    福哥答案2021-01-31:[答案来自此链接:](https://www.zhihu.com/question/442112697)一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Ma ...