爱游戏全站app官网入口-爱游戏官网

windows/dos与unix文件格式之间的相互转换(/r/n问题) -爱游戏全站app官网入口

2023-09-02,,

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

爱游戏全站app官网入口 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 /* 爱游戏全站app官网入口 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 爱游戏全站app官网入口 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问题)的相关教程结束。

网站地图