2010-12-13 36 views
20

Tôi đang cố gắng tìm một cách trong Ruby để lấy một mảng byte UTF-8 và biến nó trở lại thành một chuỗi.Ruby 1.9: Chuyển đổi mảng byte thành chuỗi với nhiều byte UTF-8 ký tự

Trong IRB (Ruby 1.9.2 preview 3) Tôi có thể tạo ra các mảng byte đúng từ UTF-8 chuỗi:

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

Tuy nhiên, tôi không thể tìm thấy một cách để khứ hồi từ byte trở lại một mảng. Tôi đã cố gắng sử dụng Array.pack với tùy chọn U *, nhưng điều đó không làm việc cho các ký tự nhiều byte.

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

Có ai biết cách lấy mảng byte UTF-8 có ký tự nhiều byte và chuyển đổi nó thành chuỗi không?

Cảm ơn.

Trả lời

29

Điều này phải làm với cách pack diễn giải dữ liệu đầu vào của nó. U* trong ví dụ của bạn làm cho nó chuyển đổi dữ liệu đầu vào (giả định là trong một bộ ký tự mặc định, tôi giả định; Tôi thực sự không thể tìm thấy bất kỳ tài liệu nào) UTF-8, do đó mã hóa kép. Thay vào đó, chỉ cần đóng gói các byte và giải thích như UTF-8:

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

Mã này hoạt động giống như một nét duyên dáng. Điều này làm cho ngày của tôi. Cảm ơn! – Charlie

8

Bạn đặc biệt hỏi về một mảng byte, nhưng có lẽ codepoints là phù hợp hơn:

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

Tôi có thể sử dụng nó trên một dự án khác, nhưng đối với một trong những tôi bắt đầu với mảng byte, và phải làm việc trở lại chuỗi. – Charlie

Các vấn đề liên quan