[轉]Matz,Koichi訪談(四):多語言支援

武衛東發表於2011-08-31

By Yuanyi ZHANG | Published: July 24, 2007 原文連結

問:我們已經討論了多執行緒,下面讓我們來談談字元編碼吧。根據Ruby規劃,這將會是變動較大的一個部分。Matz,你曾經說過你計劃在Ruby中加入m17n(multilingualization,多語言支援,詳情請參見維基百科)支援,你能談談這對於Ruby使用者會有那些影響嗎?

Matz:除了字元操作上會出現一些不相容外,也沒什麼了。比如"abc"[0]將返回'a'而不是97,並且字串索引(string indexing)將基於字元而不是位元組(譯者注:中文及其他一些多位元組語言每個字元可能需要佔據多個位元組)。我想如果要說最大的變化,那就是我們可以宣稱我們現在支援Unicode了。

但是與Perl或者Python不同,Ruby的M17N不會基於Unicode實現,它將會與具體的字元編碼無關,它將能夠處理Unicode,ISO8859,EUC-JP或者是別的隨便什麼編碼,而不用將它們轉換為Unicode。

有些人可能會產生誤解,以為我們仇恨Unicode,其實不是這樣的。如果條件允許的話,我當然也很樂意使用Unicode。但是由於歷史的原因,有很多的編碼規範(比如Shift_JIS就有至少5種變化),它們之間只是在某些字元的對映上存在一些小差異,但不幸的是,我們無法區別它們。因此如果強行將它們轉換為Unicode,將會造成資訊丟失。

Ko1:這個問題超出了我的研究領域,我就不發言了。

問:如果字串需要感知它所採用的編碼規範(encoding aware),是不是說我們建立每個字串時都得為它指定字符集,你能不能詳細談談這方面的設計?是不是存在一種預設編碼,我們可不可以為整個程式指定一種編碼集?

Matz:你可以在檔案的起始處通過code編譯指示(pragma)來指定這個檔案所採用的字符集,就像下面這樣:

# coding: utf-8

這句話指定了此檔案中的所有字串及正則都將按照utf-8來編碼。你也可以通過open來指定IO操作讀取到的字元編碼,比如:

open(path, "r:utf-8") do |f|
 line = f.gets
 end

或者是通過binmode(Perl方式):

f = open(path, "r")
 f.binmode(":utf-8")

普通IO的預設編碼採用Binary,STDIN則根據本地編碼(locale specified encoding)決定。當然,也可在IO操作時進行轉換,但是目前的介面還不支援這麼做,它可能看起來會是這個樣子:

open(path, "r:utf-8<gb2312")

這會將讀取到的GB2312資料轉換為utf-8。

問:那麼m17n的開發目前進展到什麼程度了,有希望在1.9.1中釋出嗎?

Matz:如果沒有什麼意外的話,支援m17n的1.9.1版本將在聖誕節前後釋出。目前字元處理方面的工作都已經完成了,但是還有一些編碼轉換方面(如String#encode方法以及IO的編碼轉換)的工作沒有完成。

相關文章