2010-08-14 17 views
8

我想編寫一個將日語字符寫入控制檯的Ruby腳本。例如:Ruby腳本中的Unicode字符?

puts "こんにちは・今日は" 

不過,我得到運行時異常:

jap.rb:1: Invalid char `\377' in expression 
jap.rb:1: Invalid char `\376' in expression 

是否有可能呢?我使用的是Ruby 1.8.6。

回答

12

您已將文件保存爲UTF-16LE編碼,一個Windows誤導性地稱爲「Unicode」。通常最好避免這種編碼,因爲它不是ASCII超集:每個代碼單元存儲爲兩個字節,其中ASCII字符的另一個字節存儲爲\0。這會混淆很多軟件;將UTF-16用於文件存儲是很不尋常的。

你所用\377\376看到(八進制爲\xFF\xFE)是在UTF-16文件前從UTF-16BE區分UTF-16LE把U + FEFF字節順序標記序列。

Ruby 1.8完全是基於字節的;它不會嘗試從腳本讀取Unicode字符。所以你只能以ASCII兼容的編碼保存源文件。通常情況下,您希望將文件保存爲UTF-8(不含BOM; UTF-8人造BOM是另一項突破一切的微軟創新)。這對於生成UTF-8頁面的網頁上的腳本非常有用。

如果你想成爲確保源代碼將忍受被保存在任何ASCII兼容的編碼,可以編碼字符串,使其更具彈性(如果少可讀性):

puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf" 

然而!寫入控制檯本身就是一個大問題。用於將字符發送到控制檯的編碼因平臺而異。在Linux或OS X上,它是UTF-8。在Windows上,它對於每個安裝區域設置都是不同的編碼(在「區域和語言選項」控制面板條目中的「非Unicode應用程序的語言」中選擇),但它的編號爲從未使用 UTF-8。這個設置又被誤導地稱爲ANSI代碼頁。

因此,如果您使用的是日文Windows安裝,則您的控制檯編碼將是Windows代碼頁932(Shift-JIS的一種變體)。如果是這樣的話,你可以使用「ANSI」或明確的「日語cp932」從文本編輯器中保存文本文件,當你在Ruby中運行它時,你會得到正確的字符。同樣,如果你想使源經受misencoding,你無法逃脫字符串中CP932編碼:

puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd" 

但是,如果你在其他語言環境的機器上運行它,它會產生不同的字符。在Western Windows安裝(代碼頁1252)上,您將無法將日語寫入Ruby的默認控制檯。 (雖然Ruby 1.9改進了Unicode的處理,但它並沒有改變任何東西,它仍然是一個基於字節的應用程序,使用C標準庫IO功能,這意味着它僅限於Windows的本地代碼頁)。

+3

這是unicode人在行動 – mykhal 2010-08-14 16:50:01

相關問題