1. 程式人生 > >DOS、Mac 和 Unix 檔案格式+ UltraEdit使用

DOS、Mac 和 Unix 檔案格式+ UltraEdit使用

一、文字格式區別 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工具。 在計算機世界,格式轉換無處不在,如字元格式、壓縮格式、網路協議格式、音視訊格式等等。所以進行相關工作時,應該多多留意。 轉載:http://blog.chinaunix.net/u3/97596/showart_1999657.html