2010-12-13 83 views
20

我正試圖在Ruby中找到一種方法來將UTF-8字節數組轉換回字符串。Ruby 1.9:將字節數組轉換爲具有多字節UTF-8字符的字符串

在IRB(紅寶石1.9.2預覽3)I可以創建從UTF-8字符串正確的字節數組:

ruby-1.9.2-preview3 > 'Café'.bytes.to_a 
=> [67, 97, 102, 195, 169] 

然而,我無法找到一種方法從字節到往返回到一個陣列。我嘗試使用U *選項使用Array.pack,但不適用於多字節字符。

ruby-1.9.2-preview3 > [67, 97, 102, 195, 169].pack('U*') 
=> "Café" 

有沒有人知道一種方法來獲取多字節字符的UTF-8字節數組並將其轉換回字符串?

感謝。

回答

29

這與pack如何解釋其輸入數據有關。在你的例子中的U*導致它到轉換爲輸入數據(假設是在一個默認的字符集,我假設;我真的無法找到任何這種文件)到UTF-8,因此雙重編碼。取而代之的是,只包了個字節,解釋爲UTF-8:

irb(main):010:0> [67, 97, 102, 195, 169].pack('C*').force_encoding('utf-8') 
=> "Café" 
+0

代碼工作就像一個魅力。這件事情讓我感到很快樂。謝謝! – Charlie 2010-12-15 01:28:29

8

你問具體的字節數組,但也許碼點更適合:

ar = 'Café'.codepoints.to_a 
# => [67, 97, 102, 233] 
ar.pack('U*') 
# => Café 
+0

我可能會在另一個項目中使用它,但是對於這個項目,我從字節數組開始,並且必須返回到字符串。 – Charlie 2010-12-15 01:29:43

相關問題