在 Linux 下處理從 Windows 平臺透過 TCP socket 傳送過來的文字檔案,主要是利用演演算法對文字中的字串進行變換,演演算法在 linux 下實測透過,但聯調的時候一直不對…… 透過除錯發現從文字檔案中讀出來的字串長度不對,多了一個位元組。搜了一下發現:
換行符在 Linux 和 Windows 下的區別
一、區別
換行符:
1.windows 中的換行符是 rn,
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 程式碼
windows 的換行符是 rn Linux 採用的是 n
可以採用 unix2dos 或 dos2unix 轉換文字檔案

三、回車換行符的歷史背景
早期的計算機輸出裝置不是顯示器,而是電傳打字機,結構與普通的打字機差不多。有一個列印頭在紙上打字,同時有一個電動機控制紙張的進出。當列印頭到達行尾的時候,需要兩個動作才能夠到達下一行的行首:首先執行回車動作,將列印頭移動到本行的行首,然後進行換行動作,電動機將紙張向上移動一行,這樣列印頭就處於下一行的行首,可以繼續進行列印。回車和換行對應的控制字元分別是 r 和 n,這就是 windows 中換行符為 rn 的由來。後來由於經常連續執行,所以在印表機中將這兩個控制字元簡化為一個控制字元,這就是 linux/unix 中的換行符 n 的由來。
Unix 系統裡,每行結尾只有 “<換行>”,即 “n”;Windows 系統裡面,每行結尾是 “ <回車><換行>”,即 “rn”;Mac 系統裡,每行結尾是 “<回車>” 。一個直接後果是,Unix/Mac 系統下的檔案在 Windows 裡開啟的話,所有文字會變成一行;而 Windows 裡的檔案在 Unix/Mac 下開啟的話,在每行的結尾可能會多出一個^M 符號.
四、引起的現象和問題:
1. 問題一
​ 做一個日誌檔案的時候發現由 printWriter 寫出來的檔案在 windows 上開啟 是混亂的,因為在 linux 下執行 printLn 方法時 寫入的換行符是 n ,在 windows 沒法識別 rn 才能被認為是換行
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 ’12n34r56nr78rn’ > 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.
在解析文字或其他格式的檔案內容時,常常要碰到判定回車換行的地方,這個時候就要注意既要判定”rn” 又要判定”n” 。寫程式時可能得到一行, 將其進行 trim 掉’r’, 這樣能得到你所需要的 string 了。
‘n’ 10 換行(newline)
‘r’ 13 回車(return)
最後:
ctrl+M: ^M 也稱回車鍵