去年 (2025) 中我和 EH 每天交換一個資安 / 電腦小知識,這篇是其中一個在 5/26 寫的。
而現在他比我強多了

這是我在寫 exploit 的時候遇到莫名的 bug 而學到的

換行字元其實有兩種
CR(Carriage Return):表示「回到起始點」,表示作 \r^M,ASCII碼13
LF(Line Feed):表示「下一行」,表示作 \n^J,ASCII碼10

在電傳打字機(Teletype Model 33)的時代,打印完一行換行時需要時間,而這個時間剛好可以打兩個字符。如果這時又有新的字符傳過來,那麼這兩個字符將丟失。於是研製人員在每行後面加兩個表示結束的字符。一個就是CR,告訴打字機把打印頭定位在左邊界;另一個是LF,告訴打字機把紙向下移一行。
(改自 https://seacatcry.pixnet.net/blog/post/13732061)

到了電腦時代,就出現分歧了,因為一開始儲存空間很貴,所以有一派人認為用一個字元表示換行就好了,所以才會變成 Windows/DOS 的換行還是兩個字元(CRLF),而 Linux 只有一個字元(LF)

影響呢?比如你在 Linux 編輯好的一個文件,到 Windows 打開可能全部都變成在同一行(我是沒遇過,可能早期才會這樣),或者在 Windows 寫好的程式,放到 Linux 神奇地出 Bug,比如:

神奇的 Bug

0d0a 分別是 CR、LF。這個 Script 是在 Windows 底下編輯的,所以換行是 CRLF,但對於 Linux 來說,LF 才是換行,所以才會報錯。

可以注意到在 VSCode 或 Windows 記事本底下其實都有寫目前換行的模式是什麼:
vscode 記事本

那如果有一個換行模式為 CRLF 的檔案,要怎麼把它變成 LF 的模式呢?我們有三種方法

  1. 使用工具:dos2unix file_CRLF.txt
  2. 使用內建指令:
    我們只要把所有的 CR 字元移除就好,因此直接用 tr -d ‘\r’ < file_CRLF.txt > file_LF.txt
  3. 使用 VSCode:點 VSCode 底下的 CRLF 或 LF(顯示目前換行格式的那格),其實可以直接改
    VSCode 直接改