1. 源起

換行符(newline)這個看似簡單的概念,其實有著相當長的歷史。換行符來自老式打字機老式打字機

早期的打字機具有一個可左右移動的「字頭滑架(carriage)」結構,用來讓字槌在紙上敲出對應的字元。 在排版時,文字依序從左到右、從上到下輸出,因此當一行被打滿後需要做兩件事:

  • 將紙張往上滾動一行 — line feed(LF)
  • 將字頭滑架移回最左邊 — carriage return(CR)

這兩個動作本質上都是「控制機械位置」,而不是「輸出文字」。為了簡化操作,在鍵盤上只需要按下一個 Enter 鍵即可一次完成兩個動作。

2. 電腦時代的延續:\n 與 \r

到了電子計算機時代,鍵盤與打字機的設計一脈相承,CR 與 LF 也一起被編入 ASCII 表。 對應如下:

  • \n → line feed(換到下一行)
  • \r → carriage return(回到行首)

因為早期儲存空間昂貴,不同系統對「換行」採用了不同的組合方式,以節省空間或維持相容性。 這兩個字符都佔一個長度。但早期計算機存儲非常昂貴,兩個字符表示換行符佔據空間太多,不同系統就有了自己的設計:

簡寫 全名 符號 系統 記憶方式
cr carriage return \r mac mac 中有 c
lf line feed \n linux linux 也是以 l 開頭的
crlf carriage return line feed \n\r Windows microsoft 先是 cr 再是 f

3. 遇到问题

因為不同作業系統採用不同的換行符格式,所以當同一份文件跨平台使用時,常會遇到以下問題:

3.1. Windows -> Linux,出現 ^M

在 Linux 環境中打開 Windows (CRLF) 文件時,每行行尾常會看到Hello world^M,這個 ^M 就是 \r(CR)的可視化顯示方式。

3.2. Linux -> Windows,換行不正常

Windows 的某些程式假設換行一定是 CRLF,因此遇到只有 \n 的文件時:

  • 可能換行不正確
  • 或整段文字顯示成一行

3.3. 早期 macOS 格式(僅 CR)

雖然現在較少見,但如果打開只有 \r 的文件(舊版 Mac 格式),部分編輯器可能完全不會換行。

4. 解决办法

  • ✔ 方法 1:使用現代編輯器自動轉換(推薦) 如 VS Code、Sublime Text、Notepad++ 都能自動偵測並轉換換行格式。 例如 VS Code: 右下角點擊 LF / CRLF → 選擇要轉換的格式即可。

  • ✔ 方法 2:使用命令列工具轉換

# Linux / macOS
dos2unix file.txt #將 Windows CRLF 轉成 Unix LF
unix2dos file.txt # 將 Unix LF 轉成 Windows CRLF

手動替換(不推薦,但可用)

# 移除所有 CR (^M)
sed -i 's/\r$//' file.txt
  • ✔ 方法 3:在程式語言內處理(如 Python)

Python 預設會自動識別換行符,但若需要手動處理:

with open("file.txt", "r", newline="") as f:
    content = f.read().replace("\r\n", "\n").replace("\r", "\n")