Windows/DOS与Unix文件格式之间的相互转换(/r/n问题)
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问题)的更多相关文章
- dos与unix文件格式之间的转换
1. VI编辑器中转换 在VI中使用命令 set ff?(fileformat)可以查看文件的格式,使用set ff=dos(unix)可以设置文件的格式 2.使用sed处理(来至http://www ...
- DOS和UNIX文本文件之间相互转换的方法
在Unix/Linux下可以使用file命令查看文件类型,如下: file dosfile.txt 使用dos2unix 一般Linux发行版中都带有这个小工具,只能把DOS转换为UNIX文件,命令如 ...
- DOS、Mac 和 Unix 文件格式+ UltraEdit使用
文件格式 区分DOS.Mac 和 Unix分别对应三种系统 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种 文件模式 区分ASCII模式和Binary模式 通常由系统决定,大多数 ...
- DOS、Mac 和 Unix 文件格式[转]
DOS.Mac 和 Unix 文件格式 相信很多朋友都碰到过这三种文件格式的互换问题,今日又碰到这个问题,忽然想寻根问底,于是整理了本文档. 文件格式区别 我们先看看这三个家伙有啥区别.很久以前, ...
- DOS文件转换成UNIX文件格式详解
转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...
- 【改】DOS文件格式转UNIX文件格式
windows中的文本文件的换行符是"\r\n",而linux中是"\n",dos格式文件传输到unix系统时,会在每行的结尾多一个^M,当然也有可能看不到,但 ...
- dos文件格式转换为Unix文件格式
做linux开发的,一般还是在windows上装个虚拟机,在windows上开发, 所以就会出现dos文件与unix文件格式不一致,当windows上的文件在linux上用的时候,经常在每行的末尾会出 ...
- DOS & UNIX文件格式转换
1.使用vi编辑器 vi xxxx :set fileformat=unix(or dos) :wq 2.使用 dos2unix 这个只能把DOS转换成UNIX文件 . sudo apt-get in ...
- windows dos命令大全
windows dos命令大全 一.windows DOS命令概述 Windows的dos命令又是Windows的CMD命令.而cmd命令又是原来MS-DOS系统保留下来. DOS来源路径与配置对应的 ...
- 转载自CSDN,结论:windows下按ENTER键应该是\r\n ascii码为 13 10
记得在Windows下学X86汇编语言时,用0DH(\r)和0AH(\n)来输出回车(跳到下一行的开始处).问题来了,在Windows下是 先回车再换行呢还是先换行再回车呢?在Unix系统下换行只有\ ...
随机推荐
- day11:return关键字&全局/局部变量&函数名的使用&函数的嵌套&nonlocal关键字&locals/globals
关键字:return 自定义函数的返回值,return可以把值返回到函数的调用处 1.return+六大标准数据类型,还有类和对象,函数 如果不定义return,默认返回的 ...
- Java:一篇学好设计模式
什么是设计模式 简单理解,设计模式是前人多年写代码踩坑总结出来的优秀代码攻略,目的是减少大量无用代码,让项目更好维护 七大设计原则 接下来要讲的23种设计模式,但遵循下面的七大原则: 单一职责原则 2 ...
- 使用laravel开发微信公众的一个大坑,适合新手学习的laravel接入微信接口
最近使用laravel做微信公众号二次开发,发现网上能够参考的资料基本上很少,很多地方都讲的不够详细,致使许多新手采坑无数,所以这篇文章讲一下如何使用laravel接入微信接口,实现微信公众号二次开发 ...
- Vite-Admin后台管理系统|vite4+vue3+pinia前端后台框架实例
基于vite4.x+vue3+pinia前端后台管理系统解决方案ViteAdmin. 前段时间分享了一篇vue3自研pc端UI组件库VEPlus.这次带来最新开发的基于vite4+vue3+pinia ...
- $.set() 处理非响应式案例
<template> <div id="app"> <ul> <li v-for="item in list" :ke ...
- 即时通讯系统为什么选择GaussDB(for Redis)?
摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...
- hasOwnProperty的作用、配合for in使用 、key in Object判读key
我们都知道,对象以 key|value的形式存在 它和数组一样可以遍历,对象可以通过for in 去遍历,拿到遍历对象的所有key 某些idea在使用for in 时,提示代码片段中就有出现以下这种情 ...
- RTCP常见报文格式(申请I帧/RR/SR/SDES)
本篇文章是基于对RTCP基本协议有所了解情况下,进行说明,因为RTCP在丢包重传(ARQ)方面需要使用 到,具体可以查看RTCP相关rfc文档或者博客.所以本篇文章主要是从抓包报文角度来看RTCP协议 ...
- 用C++编写一个简单的发布者和订阅者
摘要:节点(Node)是通过 ROS 图进行通信的可执行进程. 本文分享自华为云社区<编写一个简单的发布者和订阅者>,作者: MAVER1CK . @[toc] 参考官方文档:Writin ...
- Django笔记三十二之session登录验证操作
本文首发于公众号:Hunter后端 原文链接:Django笔记三十二之session登录验证操作 这一篇笔记将介绍 session 相关的内容,包括如何在系统中使用 session,以及利用 sess ...