2010-12-13 11 views
20

Sto cercando di trovare un modo in Ruby per prendere un array di byte UTF-8 e trasformarlo in una stringa.Ruby 1.9: Converte array di byte in stringa con caratteri UTF-8 multibyte

In IRB (Rubino 1.9.2 preview 3) posso creare l'array di byte corretta da UTF-8 stringa:

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

Tuttavia, non riesco a trovare un modo per andata e ritorno da byte di nuovo ad un array. Ho provato ad usare Array.pack con l'opzione U *, ma questo non funziona per i caratteri multibyte.

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

Qualcuno sa un modo per prendere una matrice UTF-8 byte con caratteri multibyte e riconvertirlo in una stringa?

Grazie.

risposta

29

Questo ha a che fare con il modo in cui pack interpreta i dati di input. Il U* nell'esempio fa sì che sia convertire i dati di input (presumibilmente in un set di caratteri predefinito, presumo, non ho trovato alcuna documentazione di questo) su UTF-8, quindi la doppia codifica. Invece, proprio pack i byte e interpretare come UTF-8:

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

Il codice funziona come un fascino. Mi ha cambiato la giornata in positivo. Grazie! – Charlie

8

È specificamente chiedere informazioni su di un array di byte, ma forse codepoints sono più adatti:

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

Potrei usarlo su un altro progetto, ma per questo inizio con l'array di byte e devo tornare alla stringa. – Charlie

Problemi correlati