一、文本格式区别
用UltraEdit打开unix文本文件时总会提示:是否将文件转换为dos格式。在windows编辑配置文件,然后用ftp上传到linux主机,发现运行时读取配置文件有错。由于没有经验,分析了半天。
UltraEdit另存为有1.DOS终结符-CR/LF
2.UNIX终结符-LF
3.MAC终结符-CR
具体分析,在 utrledit下打开分别打开一个dos和unix的文本文件,然后选择十六进制编辑,即可看到其编码内容(可以批量替换来转格式 bat文件)。unix下的回车是用0x0A表示的,而dos下的回车则是0x0D0A。
在windows下用utraledit编辑后,可以在文件菜单下找到转换为unix格式,然后再上传主机。但是这时还有问题,因为有的ftp工具可以选择以文本或者二进制格式传输,这时则必须选择二进制,否则传输时又会被改为dos格式。
unix文本文件和windows/dos文本文件的格式区别主要是两点:
换行符:
unix(/n) windows/dos(/r/n)
Ctrl: ^J ^M^J
Dec: 10 13+10
Hex: 0A 0D+0A
Code: LF CR+LF
文件结束符:
unix windows/dos
Ctrl: ^D ^Z
Dec: 04 26
Hex: 04 1A
ASCII模式和Binary模式的区别是回车换行的处理,Binary模式不对数据进行任何处理,ASCII模式将回车换行转换为本机的回车字符,比如:UNIX下是\n,Windows下是\r\n,Mac下是\r。
ASCII模式下会转换文件,不能说是不同系统对回车换行解释不同,而是不同的系统有不同的行结束符。UNIX系统下行结束符是一个字节,即十六进制的0A,而Windows的系统是两个字节,即十六进制的0D0A,所以当你用ASCII方式从UNIX的FTP Server下载文件到Windows系统上时(不管是二进制或者文本文件),每检测到一个字节是0A,就会自动插入一个0D,所以如果你的文件是二进制文件,比如可执行文件、压缩包什么的,就肯定不能用了。如果你的文件就是UNIX下的文本文件,你用ASCII模式是正确的,要是误用了Binary模式,你在Windows上看这个文件是没有换行的,里面是一个个的黑方块。
一般来说,我们最好都用Binary方式,这样可以保证不出错。如果有文本格式转换的问题,即UNIX格式的文本和DOS格式的文本之间的转换,有很多工具可以做的,不要在ftp传输的时候冒险,尤其是你如果对这些东西不是非常清楚的话。
在printf这样的函数中, 如果你出现一个\n, 它却代表了一个逻辑上的意义, 即它代表在本地系统上的那种回车换行, 所以它在UNIX上只是<LF>, 但如果你在DOS上用诸如Truboc编程的话它输出的是<CR><LF>。
UltraEdit 每次打开新文件的时候,都提示:
文件可能不是DOS格式,
你要转换 File 为 DOS 格式吗?
高 级 -> 配置 -> 文件处理 -> DOS/UNIX/MAC 处理 -> UNIX/MAC 文件检测/转换 中,取消原先选择的
检测文件类型并提示进行更改,选取 禁用
DOS、Mac 和 Unix 文件格式 相信很多朋友都碰到过这三种文件格式的互换问题,今日又碰到这个问题,忽然想 寻根问底,于是整理了本文档。 文件格式区别 我们先看看这三个家伙有啥区别。
很久以前,人们用老式的电传打字机作为输入设备,它使用 两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,),另一个字符把纸上移一行 (称为换行,)。 当计算机问世后,由于存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。于是 UNIX 开发者决定他们可以用 一个字符来表示行尾。
Apple 开发者规定了用 。 开发 MS-DOS (以及微软视窗) 的那些家伙则决定沿用老式的 。三种行尾格式如下: unix dos mac 这意味着,如果你试图把一个文件从一种系统移到另一种系统,那么你就有换行符方面的麻烦。 转换 有需求就会有动力。
在Windows平台,有强大的UltraEdit,它支持DOS、Mac 和 Unix 三种文 件格式的任意互换。在【文件】->【转换】选项卡下有相应的对应选项,很傻很强大。
下面我们看看在Unix/Linux平台该如何做呢?
方法一:强大的dos2unix dos2unix filename
方法二:强大的脚本 sed ‘s/^M//‘ filename > tmp_filename 其中^M是同时Ctrl+V+M按出来的,表示回车。 或 tr -d "\r" filename 或 cat filename | perl -pe ‘~s/\r//g‘ > tmp_filename
方法三:强大的vim vim filename :set fileformat=unix :w 或 vim filename :%s/^M//g :w 与vi不同,vim具有自动识别功能,只需如下设置就可以自动进行转换。不过由于Mac格式比较特殊,vim对mac格式的自动探测可能会出错。请参考: http://vimcdoc.sourceforge.NET/doc/usr_23.html vim filename :set fileformats=unix,dos,mac 批量转换 有时候我们可能希望对这种转换进行批量处理。
在Windows下有强大的UltraEdit,用全局replace的方法或者建立工程的方法可以批量转换,请参考 http://tech.ddvip.com/2007-10/119380983936863.html 。Windows平台下还有很多相关的小工具,如MultiU2D等,google一下吧。 在Unix/linux平台下我们就要借助脚本文件或者通道了,实质上是上述几种方法的自动化。
下面举几个简单例子,来源自 http://bbs.chinaunix.net/viewthread.PHP?tid=412957&extra=&page=1 :
脚本1: ls -l | awk ‘{print $8}‘ > filename.txt N=1 NN=`wc -l filename.txt | awk ‘{print $1}‘` while [ "$N" -le "$NN" ]; do TempLine=`sed -n "$N"p "filename.txt"` if [ -n "$TempLine" ]; then tmpfilename=$TempLine dos2ux $tmpfilename > file mv file $tmpfilename fi N=$(($N + 1)) done
脚本2: for XFILE in $(egrep -l ^M `find . -name "*.txt";find . -name "*.sql"`) do echo "开始处理文件"$XFILE if [ -s $XFILE ] then TMPFILE=$XFILE.tmp mv $XFILE $TMPFILE tr -d "\r" $XFILE rm $TMPFILE else continue fi done 通道法: find . -type f |xargs -i dos2unix {} 后记 对于Mac格式转换到其他两种格式的方法类似,在类Unix环境下有dos2unix/mac2unix工具。 在计算机世界,格式转换无处不在,如字符格式、压缩格式、网络协议格式、音视频格式等等。所以进行相关工作时,应该多多留意。