2014-07-23 23 views
2

我在Ruby中有一個UCS-2LE編碼字節數組,因爲這是我的完整開始與Ruby我努力將其轉換爲UTF-8字符串,我有相同的代碼在PHP & Java工作得很好。如何將UCS-2字節數組轉換爲Ruby中的UTF-8字符串?

在PHP中,我用iconv庫,但是在Ruby的iconv已被棄用:

$str = iconv('UCS-2LE', 'UTF-8//IGNORE', implode($byte_array)); 

在Java中我使用:

str = new String(byte_array, "UTF-16LE"); 

字節數組中被編碼爲2每1個字符的字節數,如何在Ruby中執行類似的轉換?我已經嘗試了一些解決方案,但它不適合我。謝謝。

+1

你讀過http://stackoverflow.com/questions/1033104/how-do-i-convert-a-ucs2-string-into-utf8? –

+1

'byte_array.pack(「C *」)。force_encoding(「UTF-16LE」)。encode(「UTF-8」)'應該可以工作 – Stefan

+0

@Stefan它工作得很好,我建立數組將項目放置爲.chr類型,我已經刪除了.chr並添加了你的代碼,它工作的很好,有一件事我不明白,它是如何處理C *類型的,而文檔指出C是一個char(而不是寬字符)? –

回答

3

假設一個字節數組:

byte_array = [70, 0, 111, 0, 111, 0] 

可以使用Array#pack到整數值轉換爲字符(C將每個整數爲unsigned char):

string = byte_array.pack("C*")  #=> "F\x00o\x00o\x00" 

pack返回與串ASCII-8BIT編碼:

string.encoding      #=> #<Encoding:ASCII-8BIT> 

您現在可以使用String#force_encoding重新解釋字節爲UTF-16字符串:

string.force_encoding("UTF-16LE") #=> "Foo" 

的字節至今沒有改變:

string.bytes       #=> [70, 0, 111, 0, 111, 0] 

轉碼串入另一編碼,使用String#encode

utf8_string = string.encode("UTF-8") #=> "Foo" 
utf8_string.bytes     #=> [70, 111, 111] 

整個轉換可以寫成一行:

byte_array.pack("C*").force_encoding("UTF-16LE").encode("UTF-8") 
相關問題