天天看點

[轉載]細說"回車"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

引言

最近在php還有c#以及memcache的shell當中經常看到\r\n的寫法,剛開始還沒注意,

不過後面感覺這樣寫有些不對頭,\r表示回車  \n表示換行,那這樣不是換行了兩次嗎?

 為了解決疑惑,問了下度娘,總算對\r \n有了新的認識。

解釋

首先 \r 是回車, \n 是換行,這毋庸置疑,但是前者的作用隻是将光标移到行首,後者是将光标移到下一行。

也就是說 你敲鍵盤的 Enter鍵<Enter> 其實是回車和換行的組合鍵(\r\n)。不同的作業系統,其原理也不一樣

如果把一個文本的空格和回車等都反轉義,就是顯示出轉義符,那麼你會看到

windows每行結尾都有\r\n

Unix每行結尾隻有\n

Mac每行結尾隻有\r      

這個三個作業系統是故意的吧,這麼不統一,這也是為啥 linux 檔案拿到 windows 下會錯行的原因。

下面做個小實驗來看看這個錯行現象

實驗

1.在 Linux 下vim a.txt 編輯一個文本

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

2.把這個文本弄到windows下面看看

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

 可以發現錯行了!!!因為對于windows上面的換行條件還少了個字元\r

那麼windows下看起來正常的檔案在Linux下面又會變成啥樣?

3.在Windows下編輯一個文本

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

通過ftp傳到Linux下後,打開

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

簡直慘不忍睹,H和o都合并再一起了,^M又是啥玩意,不着急後面會講到

可見得我們在平時使用電腦時,已經習慣了回車和換行一次搞定,敲一個Enter鍵,即是回車,又是換行。

\n  軟回車
在Windows 中表示換行且回到下一行的最開始位置。
在Linux、unix 中隻表示換行,但不會回到下一行的開始位置。      
\r  軟空格
在Linux、unix 中表示傳回到當行的最開始位置。
在Mac OS 中表示換行且傳回到下一行的最開始位置。       

 下面是回車和換行的曆史,有興趣的人可以閱讀下

曆史

回車(carriage return)和換行(line feed)兩個概念的來曆和差別

計算機還沒出生之前,有一種玩意叫電傳打字機,每分鐘可以打10個字元。但是他有個問題,

就是打完一行換行的時候要用去0.2秒,大約是打兩個字元的時間。

而就在他使用這0.2秒進行換行的時候又有新的字元傳過來,那麼這個字元将會丢失。

于是,研制人員想了個辦法解決這個問題,就是在每行後面加兩個字元表示結束的字元。

一個叫做回車,它用來告訴打字機把列印頭定位于在左邊界,另個叫換行,它用來告訴打字機

把紙往上挪一下。這樣打字機在換行時使用的0.2秒時間丢棄的隻是兩個不需要顯示出來的字元。

計算機誕生後,這兩個字元也搬了過來,那時候存儲器很貴,一些科學家覺得每次換行都要花費空間來放下這兩

個字元太浪費了,加一個就可以了,于是出現了分歧。Unix系統每行結尾隻有\n,Windows系統每行結尾是\r

\n,Mac系統每行結尾是\r。一個直接的結果就是如我上面的實驗那樣,同一文本在不同系統下會出現不同的結

果,這當然不是我們想要的效果

Dos 和 Windows 采用回車+換行 CR/LF 表示下一行即 ^M$

Unix 和 Linux 采用換行 LF 表示下一行即 $

Mac 采用CR表示下一行 即^M

CR 用\r表示 十進制ASCII為13 十六進制0x0D

LF 用\n表示  ASCII為10 十六進制0X0A

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

看!有圖有真相,我可沒瞎說哈。

解決

需要注意的是,不同平台之間用FTP協定傳輸檔案時,在ASCII模式下傳輸可能會自動對換行進行轉換,進而導緻位元組數的變更

如果不想ftp對檔案的修改,可以使用Bin模式進行文本傳輸。那麼如何解決不同平台的文本錯行顯示呢?

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

1.windows 文本到 linux 下的轉換方法.

(1)使用sed 指令進行替換

sed -e 's/^M//g'  old.txt > new.txt      

 注意這個^M是先按Ctrl+V 然後按Ctrl+Shift+M 才能打出來的不是直接打^M

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

 ==  

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

(2)vim編輯器的替換指令

:%s/^M//g      
[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

  => 

[轉載]細說"輸入"和"換行"的故事 引言 解釋 實驗 曆史 解決   總結

同樣^M不是直接打出來的,會變成藍色,而不是白色

(3)使用指令行

tr -d "\r"<dosfile > unixfile      

(4)使用dos2unix工具

dos2unix a.txt        #直接轉換
dos2unix -n a.txt b.txt #保留源檔案      

(5)FTP傳輸工具

如果是以ASCII模式傳輸,那麼FTP會幫你轉換

如果是以Binary模式傳輸,那麼FTP保留原檔案

總結

如果有些細節上的問題不重視,那麼可能就會帶來頭疼的問題,或者不必要的麻煩。

轉載請指明出處:http://www.cnblogs.com/demonxian3/p/6917133.html