What have you found for these years?

2008-09-18

newline, LF and text mode

上次波卡在 再度跟 rails 撞名 裡提到關於 encoding 的問題,
正好最近 ruby-core 上關於 encoding 的東西討論得如火如荼...

我發現 core developer 在不少地方都用到了所謂 binary mode 處理一些關於
encoding 的問題。可以先參考這篇:Reading non-ascii compatible files

我的問題跟 Michael Selig 相同,binary mode 不是 windows specific 嗎?

*

在最早的時候,我不明白 text mode 和 binary mode 的差異。
後來慢慢得知 windows 在 text mode 下有 newline conversion,
而 binary mode 不會做這樣的 conversion. 而在 unix 系統上,
則沒有 text mode 和 binary mode 的差異。

就這樣錯誤認知了好幾年 orz

因為我不明白為什麼 ruby-core 上的討論會是如此,所以稍微看了一下 wikipedia:
Newline in programming languages

然後才發覺我被 unix 誤導 @_@
我一直以為 \n 其實就是 LF (linefeed, U+000A),
但事實上只是正好 unix 是如此罷了...
也就是說,不是 unix 沒有這兩個 mode, 而是正好這兩個的結果是相同的。

這邊有好多歷史啊,真不知道該從何說起。
我後來知道 dos 用 CRLF 當 newline 是因為打字機之類的關係,
而 windows 沿用這個標準。但我那時還以為這樣就表示 CRLF = \r\n ...

事實上 \r 跟 \n 完全是 C 的東西,說 \r\n 是 CRLF, 變成是在
unix 上看 windows 上的 text file 了...

怪不得 text editor 都是寫 CRLF 或 LF 或 CR, 沒在寫 \n 的 @_@

為此我特地去翻 ISO/IEC 9899:1999 (C99), 5.2.2 第三條:

Each of these escape sequences shall produce a unique implementation-defined value
which can be stored in a single char object. The external representations in a text file
need not be identical to the internal representations, and are outside the scope of this
International Standard.

escape "sequence", 這邊明確說明了 \n 不見得是 "a" character.
然而 internal 必須可以儲存在 char 裡面,而輸出到 text file 中,
到底是 a character 還是 character sequence, 則不在標準定義中。

這也是在說,text mode 和 binary mode 是本來就存在的。
其實前者應該也跟 encoding 有關,或許 text mode 可以做一些自動的
encoding conversion. mysql 不知道是不是就有這個狀況,導致 encoding
設定不正確的話,抓出來都是一堆垃圾 bytes...

*

欸,搞這麼複雜幹嘛啊...
最好還是一個 encoding 就好,這樣就不用分啥 text mode 和 binary mode...

3 retries:

老林 said...

godfat 今天(週日)在家嗎 @_@a

老林 said...

你有把我第二顆隨身碟裡的精靈守護者最後幾集 copy 過去嗎 ?_?

回家後回想 ...印象中你好像沒這個動作 XD 你要不要 check 一下 XD

Lin Jen-Shin (godfat) said...

睡了約 14 小時到 4 點多.....

剛剛算了一下,全都有了,只是排序好混亂啊 XDDD

不過我本來想要拿電腦線圈總集篇,忘記了 XD

雖然上次看到 13.5 真的很無聊... orz

Post a Comment

Note: Only a member of this blog may post a comment.



All texts are licensed under CC Attribution 3.0