以前看到EditPlus里面文本文件可以设置PC/UNiX/MAC三种格式,UltraEdit中可以设置DOS格式和Unix格式,一直不知道区别在那里。原来回车(CR)和换行(LF)符都是用来表示下一行的。于是产生了三种不同的用法:Dos和windows采用回车+换行(CR+LF)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。
涉及在PC和Unix两个平台下工作的人,
或注意过UltraEdit中三种文本文件格式的人, 或知道vim中:set fileformat选项的人,
应该知道在当今的电脑世界中, 存在三种文本格式:
PC: 或者说DOS的,
或者说微软的, 或者说WINDOWS的,
以为行尾的标志.
其中的ASCII是十进制数的13, 十六进制的0x0D.
的ASCII是十进制10,
十六制为0x0A.
Mac:
以作为文本文件行尾的标志符
UNIX:
以作为文本文件行尾标志符
在很多计算机语言中,
表示为字符或字符串是\r,
而表示为字符或字符中是\n.
而在printf这样的函数中, 如果你出现一个\n,
它却代表了一个逻辑上的意义, 即它代表在本地系统上的那种回车换行,
所以它在UNIX上只是,
但如果你在DOS上用诸如Truboc编程的话它输出的是
Unix上有一个小工具, 专门在两种文件格式之间进行转换,
叫unix2dos, dos2unix.
在UltraEdit的
File->Conversions(有些版本是在Format ->
Convert to..)菜单中, 有三个子菜单项就是专供你在各种文本格式之间转换的.
在vim中, 如果你想把一个文件存为另一种文件格式, 只需:set
fileformat=unix或等号后面是dos, mac即可,
接下来的存盘动作就会自动把你的文件存为指定平台的格式.
查看一个既有文件的格式:
unix: file
filename
注意第一个file是一个命令, 它会报告给定的文件的类型.
实际上它维护了一个各种文件类型特征的一个数据库, 可以告诉你任何文件的类型(当然前提是得先编进入数据库),
不光是文本文件格式这种小儿科
windows:
办法一: 可以用记事本打开, 如果正常就是一个DOS格式的,
如果出现一个超长的变态的行, 那可能是unix的也可能是mac的格式,
我在winxp上试验的结果是这两种格式引起的外在表现都一样.
办法二:使用编辑器例如NotePad++查看,通过菜单 VIEW
-> Show all
characters显示所有字符,通过回车换行符的格式查看。
办法三:用cygwin中的file命令,
如上.
办法四:用cygwin中的 sed -n 1p
filename.txt | xxd -g1
看最后显示的两个十六进制数是0D
0A还是其中的数加一个
完全可以在一个平台下使用另一个平台的文本格式,
只要所有处理到这个文本文件的程序都要知晓这一约定. 它其实只是各个程序之间的一种约定, 比如你用word创建了一个文件,
另存为纯文本时, 它当然存为DOS格式的了, 而同样是微软的程序记事本也是假设同样的格式, 所以它们能工作的很好,
再往系统下面一点看, C语言中的函数库, 凡是在DOS/WINDOWS平台上的实现, 它也会考虑同样的约定,
这样你用fputs或fgets来写/读文本文件时,
写入的自然也就是了.
其它平台的情形自然也类似.
ftp的考虑
一些ftp的客户端程序会自动进行各个平台的文本文件格式转换.
所以要注意你在ftp中用ls看看到的文件大小未必是你下载下来的文件大小. 上传过程也是一样.
如果你不想ftp这样自作主张只要用bin命令即可.
它会告诉ftp进行逐字节的高保真二进制模式传输.
每个文件都从一而终吗
不必然. 我在linux中经常碰到一些文件被莫名其妙地弄得雌雄莫辨,
一些行是DOS格式的, 一些行是UNIX格式的, 这么说可能会让人越来越乱, 怎么可能在UNIX上有DOS格式的呢.
又怎么可能一个文件内部有两种格式呢. 了解了这个问题的实质其实上面所说都只是一些文字上的方便, 或者说文字上造成的不方便.
所谓DOS文本格式无非是可见文字编码(不仅限于ASCII了,
中文文本文件也算是)中间插入了这两个字符.
而UNIX文本格式也无非是以作分隔罢了.
它一会以这个分隔一会以那个分隔就是所说的混合格式了.
碰到这种文件unix2dos和dos2unix两个工具仍然能应付.
但对于vim就不行了. 简单的:set ff=unix会让它莫衷一是, 因为文件的一部分已经是unix的了.
它也确实是把文件在内部认为是unix格式了.
此时就只能把多余的干掉了.
它在vim中显示是一个^M字符. 视你的终端和颜色配置情况,
往往还带着扎眼的亮色.
:%s#^M##g
上面命令中的^M是一个字符,
代表回车,
输入的办法是在UNIX中先按再按回车键,
在windows中要先按, 再按回车键,
原因只是在WINDOWS中大家已经习惯用来粘贴,
所以VIM把这个键映射到了上.