11月 28, 2009

各系統的換行(Newline)符號

詳情可以參考:wikipedia Newline

換行符號在不同的系統上會有差異,共有三種分類:CRLFCR-LF。各代表的是:
  • CR (Carriage Return) :Mac OS
  • LF (Line Feed):Unix-like System
  • CR-LF (Carriage Return, Line Feed):Windows
在 C 語言中使用 '\n' 表示換行,使用 '\r' 回到行首。但這並不代表 '\n' 就對應 LF,也不代表 '\r' 對應 CR 控制碼。標準 C 語言只保證兩件事情:
  1. 跳脫字元(escape sequences) 唯一對應到一個內碼,這個內碼的長度等同 char 大小。
  2. 當在 text mode 下使用 '\n' 時,這個跳脫字元會被系統轉譯成「換行」符號,不過這個符號可能超過一個 char 大小。
在 wikipedia 上的一段話:
On Unix platforms, where C originated, the native newline sequence is ASCII LF (0x0A), so '\n' was simply defined to be that value. With the internal and external representation being identical, the translation performed in text mode effectively turns into a no-op, making text mode and binary mode behave the same. This has caused many programmers who developed their software on Unix systems simply to ignore the distinction completely, resulting in code that is not portable to different platforms.
另一個常見的問題,在 Internet 上通常使用 CR-LF 來表示一行結束。這對 Windows 系統來說,使用 '\n' 可以正確無誤的送出 CR-LF 控制字元,但對 Unix 來說只會送出 LF 字元。解決方法是直接使用二進位模式,並指定數值 "\x0D\x0A" 來處理這個問題。

沒有留言:

張貼留言