2010-12-13 11 views
20

RubyでUTF-8バイト配列を取得して文字列に変換する方法を探しています。 IRBでRuby 1.9:マルチバイトのUTF-8文字でバイト配列を文字列に変換する

(ルビー1.9.2プレビュー3)Iは、UTF-8文字列から正しいバイト配列を作成することができます。私に戻ってバイトからラウンドトリップする方法を見つけることができない、しかし

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

をアレイ。 Array.packをU *オプションで使用しようとしましたが、マルチバイト文字では機能しません。

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

8

あなたは、具体的バイト配列について尋ねるが、多分コードポイントがより適している:

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

私は別のプロジェクトでそれを使用するかもしれませんが、このためにはバイト配列から始め、文字列に戻って作業しなければなりません。 – Charlie

関連する問題