Windows & Unix 文件格式之迷
同时介绍了一些与之相关的查看和操作工具, 并在 Windows, Unix 进行举例.
1. 问题提出:
我们可能会遇到过这样一些困惑:
(
本文深入揭露 Windows & Unix 格式差异, 及因此而导至的各种问题. 同时介绍了一些与之相关的查看和操作工具, 并在 Windows, Unix 进行举例. 1. 问题提出: 我们可能会遇到过这样一些困惑: (1) 如何查看一个文件或数据流的二进制格式(以十六进制格式显示)? (2) 为什么在 windows下编译的 shell 脚本在 Unix下不能执行? 为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译? (3) 为什么我在 vi 等编器下打开一个文本文件会包含 ^M, 如何把它去掉? 为什么我在 windows 上用记事本打开 unix上的文件, 文件都不换行? (4) 如何删除文件行尾的 空格 或 tab? 如何把文件中的 tab 转换成 空格, 或者把 空格 转换成 tab? 如何只转换行首 tab 转换成 空格? … [@more@] 2. 分析与方案: (1) 如何查看一个文件的二进制格式(以十六进制格式显示)? 查看任意文件或数据流的二进制格式, 我们非常常用. 方法一: 在 UtraEdit 使用 Ctrl + H 切换到十六进制编辑模式. ** 注意 ** : 此方法一有缺陷, 它会将行末的单个”换行符”显示成 “回车” + “换行” 两个字符. 这样会使问题 (2)(3)(4) 无法用此工具正确查看. 方法二: 使用文件或流的二进制查看工具 fbin fbin 可以运行于 windows 和各种 Unix 平台, 如下例的命令显示文件的前48字节: $ fbin xx.c 0×30 filename: ‘xx.c’ filelen : 0×68(104), offset: 0×38, max output: 0×30 00000000: 2369 6E63 6C75 6465 3C73 7464 696F 2E68 #include00000010: 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’unix媒体转换,十六进制显示为0D), Windows 文件格式(详细分析见下文) 换行时, 总是以 “回车” + “换行” (可以借助上一问介绍的 fbin 工具, 查看文件中是否包含 “回车换行” 对), 导到 unix 下的 shell 无法正常解释. 解决方法: 就是把 windows 格式的中的 “回车” 符删除, 删除. 方法一: 使用 vi 打开源文件, 把 ‘rn’ 替换成 ‘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 (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |