Linux與Windows下txt文件區別

在Linux下處理從Windows平臺通過TCP socket發送過來的文本文件,主要是利用算法對文本中的字符串進行變換,算法在linux下實測通過,但聯調的時候一直不對…… 通過調試發現從文本文件中讀出來的字符串長度不對,多了一個字節。搜了一下發現:

換行符在Linux和Windows下的區別

 
一、區別
換行符:    
1.windows中的換行符是\r\n,
2. linux/unix下的換行符是\n。
其中:
回車符:\r=0x0d (13) return; #回車(carriage return)
換行符:\n=0x0a (10) newline。#換行(newline)
     
二、文件格式互轉命令
1.unix2dos:將具有unix風格的格式文件轉化爲具有window下的格式文件。
2.dos2unix:將具有windows風格的格式文件轉化爲unix下的格式文件。
 
Reply-text mb10代碼  
<span style="">windows的換行符是\r\n Linux採用的是\n  
可以採用unix2dos或dos2unix轉換文本文件 </span>  
 
三、回車換行符的歷史背景
早期的計算機輸出設備不是顯示器,而是電傳打字機,結構與普通的打字機差不多。有一個打印頭在紙上打字,同時有一個電動機控制紙張的進出。當打印頭到達行尾的時候,需要兩個動作才能夠到達下一行的行首:首先執行回車動作,將打印頭移動到本行的行首,然後進行換行動作,電動機將紙張向上移動一行,這樣打印頭就處於下一行的行首,可以繼續進行打印。回車和換行對應的控制字符分別是\r和\n,這就是windows中換行符爲\r\n的由來。後來由於經常連續執行,所以在打印機中將這兩個控制字符簡化爲一個控制字符,這就是linux/unix中的換行符\n的由來。
Unix系統裏,每行結尾只有“<換行>”,即“\n”;Windows系統裏面,每行結尾是“ <回車><換行>”,即“\r\n”;Mac系統裏,每行結尾是“<回車>”。一個直接後果是,Unix/Mac系統下的文件在Windows裏打開的話,所有文字會變成一行;而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號.
 
四、引起的現象和問題:
 
1.問題一
​ 做一個日誌文件的時候發現由printWriter寫出來的文件在windows上打開 是混亂的,因爲在linux下執行printLn方法時 寫入的換行符是\n ,在windows沒法識別\r\n才能被認爲是換行
 
2. 問題二 
有時在WIN下編輯好的腳本文件上傳到LINUX服務器中不能正常執行,開始誤認爲是LINUX配置問題,後來發現,是WIN與LINUX存儲文件時的換行符標誌不同造成的。在DOS使用的換行符爲 ^M$,我們稱爲CR與LF兩個符號。而在Linux中,則僅有LF ($) 這個換行符。
  可以用如下命令完成格式轉換:$dos2unix,$unix2dos。但這兩個命令在Ubuntu發行版本中不存在,可通過:
  $sudo apt-get install tofrodos
  命令安裝。之後,再次使用如下文所示的格式即可。
  [root@linux ~]# dos2unix [-kn] file [newfile]
  [root@linux ~]# unix2dos [-kn] file [newfile]
  參數:
  -k : 保留該文件原來的mtime時間格式(不更新文件上次內容經過修改的時間)
  -n : 保留原來的舊文件,將轉換後的內容輸出到新文件,如:dos2unix -n old new
  範例:
  範例一:將提供的hosts文件格式更新爲dos格式。
  [root@linux ~]# unix2dos -k hosts
  unix2dos: converting file hosts to DOS format ...
  # 此時hosts文件的時間不會改變,但內容主要將換行符修改成爲DOS的CRLF了。
  範例二:將範例一已經變成DOS格式的hosts改名爲hosts.dos,並且轉換Linux
  格式到hosts.linux
  [root@linux ~]# mv hosts hosts.dos
  [root@linux ~]# dos2unix -k -n hosts.dos hosts.linux
  dos2unix: converting file hosts.dos to file hosts.linux in UNIX format ...
  [root@linux ~]# ll
  -rw-r--r-- 1 root root 288 Aug 1 13:30 hosts.dos
  -rw------- 1 root root 279 Aug 1 13:30 hosts.linux
  # 由於DOS格式中多了CR字符,所以,文件比較大。
 
3. 現象三
先生成一個換行(\n, 0x0A)和回車(\r, 0x0D)組合的文本
$ echo -en '12\n34\r56\n\r78\r\n' > tmp
以十六進制方式查看文本
$ od -t x1 tmp
0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
0000016
 
五、編程相關
 
文本文件的行結束符,傳統上 PC機 用 CRLF,蘋果機用CR,unix 用 LF。【CR -- 回車符,c語言'\r'】。【LF -- 換行符, c語言'\n'】。
不同計算機上c語言統一規定爲::文本文件的行結束符一律變成一個符號LF,也就是換行符,也就是new line符, 也就是'\n'. “回車和換行符轉換成一個換行符”
-- 對PC機而言,文本文件行結束符,CRLF讀入後,丟掉CR,留 LF. 例如fgets() 讀入一行,行尾只有LF,沒有CR.
在解析文本或其他格式的文件內容時,常常要碰到判定回車換行的地方,這個時候就要注意既要判定"\r\n"又要判定"\n"。寫程序時可能得到一行,將其進行trim掉'\r',這樣能得到你所需要的string了。
'\n' 10 換行(newline)
'\r' 13 回車(return)
 
最後:
ctrl+M: ^M 也稱回車鍵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章