[筆記] CRLF跟LF之區別 --- 隱形的 bug
最近在當助教時,偶然間遇到一個隱形的Bug
為什麼稱之為隱形呢?
請見下面兩張圖
說明:answer.txt 與 answer_test.txt 這兩個檔案的內容用文字編輯器打開時,完全一模一樣,但是我在使用 diff 指令的時候居然出現判定為每一行都不一樣的情形
指令 diff answer.txt answer_test.txt
由最上面第一張圖中可以注意到,answer.txt 的檔案大小是 958 byte
answer_test.txt 的檔案大小則為 924 byte
此時不禁讓我疑惑到,兩個檔案內容相同,空白數量也完全相同的情況下,造成檔案大小不同的原因是什麼呢?
下圖說明了一切
原來在 answer.txt 檔案當中,他的換行是採用 CRLF
而 answer_test.txt 的換行則是一般UNIX的情形 LF
# 以下感謝梁浩穎同學解釋
CRLF 就是 \r\n 是只有在 windows 系統在用的形式
如果想要清空 answer.txt 裡面所有的 \r 的話,可以使用以下指令
# 遇到這個隱形的bug真是難得的好玩經驗,分享給大家 :)
為什麼稱之為隱形呢?
請見下面兩張圖
說明:answer.txt 與 answer_test.txt 這兩個檔案的內容用文字編輯器打開時,完全一模一樣,但是我在使用 diff 指令的時候居然出現判定為每一行都不一樣的情形
指令 diff answer.txt answer_test.txt
由最上面第一張圖中可以注意到,answer.txt 的檔案大小是 958 byte
answer_test.txt 的檔案大小則為 924 byte
此時不禁讓我疑惑到,兩個檔案內容相同,空白數量也完全相同的情況下,造成檔案大小不同的原因是什麼呢?
下圖說明了一切
原來在 answer.txt 檔案當中,他的換行是採用 CRLF
而 answer_test.txt 的換行則是一般UNIX的情形 LF
# 以下感謝梁浩穎同學解釋
CRLF 就是 \r\n 是只有在 windows 系統在用的形式
所有的 UNIX 系統都是用 \n
(的確,上圖中的 answer.txt 是用windows 7系統的記事本所編輯的,answer_test.txt 則是用 mac 系統透過 sublime text 所編輯的)
CR是carriage return的意思,也就是\r
LF是line feed的意思,也就是\n
LF是line feed的意思,也就是\n
這就是為什麼有些檔案從unix系統拿去windows上面看 會變成全部都在同一行
因為只有LF 他不知道是換行
windows只吃CRLF
除了一些比較聰明的文字編輯器會分的出來
不過其實,CRLF才是真正的打字機運作方式,你可以想像:打字機打到最右邊,要先return到最左邊之後,再往下一行,所以是CRLF
如果想要清空 answer.txt 裡面所有的 \r 的話,可以使用以下指令
tr -d '\r’ answer.txt
# 遇到這個隱形的bug真是難得的好玩經驗,分享給大家 :)
感謝分享,非常實用
回覆刪除感謝分享,非常實用
回覆刪除作者已經移除這則留言。
回覆刪除