Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369495
  • 博文数量: 146
  • 博客积分: 2990
  • 博客等级: 少校
  • 技术积分: 1399
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:09
文章分类

全部博文(146)

文章存档

2011年(1)

2010年(2)

2009年(143)

我的朋友

分类: LINUX

2009-03-19 17:22:40

Windows & Unix 文件格式之迷
来自:
eybuild@hotmail.com
关键字: DOS, Unix 文件格式空格  tab 转换工具,
       fbin win2unix tab2unix
摘要本文深入揭露 Windows & Unix 格式差异及因此而导至的各种问题. 同时介绍了一些与之相关的查看和操作工具并在 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            00000010:  3E0D 0A0D 0A69 6E74 6D61 696E 2829 0D0A    >....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
阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~