2009-11-16 113 views
3

Ruby對UTF-8字符串不會很好。我將數據傳遞給XML文件,儘管XML文檔被指定爲UTF-8,但它將ascii編碼(每個字符兩個字節)視爲單個字符。Ruby:將編碼字符轉換爲實際的UTF-8字符

我已經開始以'\ uXXXX'格式對輸入字符串進行編碼,但我無法弄清楚如何將其轉換爲實際的UTF-8字符。我一直在搜索這個網站和谷歌無濟於事,我的沮喪現在非常高。我正在使用Ruby 1.8.6

基本上,我想轉換字符串'\ u03a3' - >「Σ」。

我有什麼是:

data.gsub /\\u([a-zA-Z0-9]{4})/, $1.hex.to_i.chr 

這當然給了 「931出焦範圍」 的錯誤。

謝謝 添

+0

請注意,UTF-8不是每個字符兩個字節。它是每個代碼點1到4個字節。如果你的gsub工作,輸出將不是UTF-8 - 它可能更接近於UCS-2或UTF-32,這取決於數字的大小。 – hrnt 2009-11-16 22:41:01

+0

我的答案是放棄Ruby。我在.NET中重寫了這段代碼,因爲我沒有時間繼續嘗試使用Ruby。我升級到1.9.1,其中不包括運行所需的大量DLL。添加完這些後,結果發現許多寶石在1.9。*版中被破壞,因爲它們使用硬編碼1.8。* DLL的二進制gem格式。最終腳本如下所示: data.gsub(/ \\ u [a-zA-Z0-9] {4} /){| s | eval('''+ s +''')} 這在1.9。*中很完美,但由於它不運行寶石,我需要我需要去其他地方看看。 – 2009-11-17 15:54:54

回答

2

有些事情會打破,因爲Ruby字符串對待UTF-8編碼的碼點作爲兩個字符?如果沒有,那麼你不應該擔心太多。如果有事情發生,請添加評論讓我們知道。解決這個問題可能更好,而不是尋找解決方法。

如果您需要進行轉換,請查看Iconv庫。

在任何情況下,Σ可能是更好的替代\u03a3。 \ uXXXX在JSON中使用,但不在XML中使用。如果你想分析\ uXXXX格式,看看一些JSON庫是如何做到的。

1

Ruby(至少1.8.6)沒有完整的Unicode支持。 Integer#chr僅支持ASCII字符,否則最多隻能使用八進制表示法('\377')以255

爲了證明:

irb(main):001:0> 255.chr 
=> "\377" 
irb(main):002:0> 256.chr 
RangeError: 256 out of char range 
     from (irb):2:in `chr' 
     from (irb):2 

你可以嘗試升級到Ruby 1.9的。 chr文檔沒有明確聲明ASCII,因此支持可能已擴展 - 儘管示例在255停止。

或者,您可能會嘗試調查ruby-unicode。我從來沒有嘗試過,所以我不知道它會有多好。

否則,我認爲你目前在Ruby中不能完成你想要的。

5

試試這個:

[0x50].pack("U") 

其中0x50是UTF8字符的十六進制代碼。

相關問題