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")