2013-06-10 46 views
40

Tôi đang viết trình thu thập thông tin sử dụng Hpricot. Nó tải xuống một danh sách các chuỗi từ một số trang web, sau đó tôi cố gắng ghi nó vào tệp. Cái gì là sai với mã hóa:Cách chuyển đổi chuỗi thành UTF8 trong Ruby

"\xC3" from ASCII-8BIT to UTF-8 

tôi có các mục được trả lại trên một trang web và in theo cách này:

Développement 

các str.encoding lợi nhuận UTF-8, vì vậy force_encoding('UTF-8') không giúp. Làm thế nào tôi có thể chuyển đổi sang UTF-8 có thể đọc được?

+2

Hpricot không còn được duy trì, xem xét sử dụng Nokogiri. Ngoài ra, bạn có lẽ nên đề cập đến những gì mã hóa của trang web gốc là. –

Trả lời

51

chuỗi của bạn dường như đã được mã hóa một cách sai lầm tròn:

"Développement".encode("iso-8859-1").force_encoding("utf-8") 
#=> "Développement" 
+0

Nó hoạt động tốt cho hầu hết các trường hợp. Nhưng đôi khi: 'U + 201C từ UTF-8 đến ISO-8859-1 trong CIDEM/ACC1Ó ' ' U + 20AC từ UTF-8 đến ISO-8859-1 trong Đầu tư phát triển bền vững của Citi 'nó không' t. Ngoài ra một số tên được chuyển đổi nhưng sai và tôi không thể gieo hạt trong cơ sở dữ liệu với thông báo lỗi 'multibyte character' không đầy đủ – ciembor

+1

Xin lỗi, điều này không có nghĩa là sửa chữa. Bạn nên khắc phục sự cố bằng cách thiết lập/phát hiện mã hóa chính xác khi đọc chuỗi vào ứng dụng của bạn. – Stefan

+0

@Stefan, giải pháp tuyệt vời, cảm ơn! – gaussblurinc

37

vẻ chuỗi bạn nghĩ rằng nó là UTF-8, nhưng trong thực tế, nó là cái gì khác, có lẽ tiêu chuẩn ISO-8859-1.

Xác định (buộc) mã hóa chính xác trước, sau đó chuyển đổi sang UTF-8.

Trong ví dụ của bạn:

puts "Développement".encode('iso-8859-1').encode('utf-8') 

Một cách khác là:

puts "\xC3".force_encoding('iso-8859-1').encode('utf-8') #-> Ã 

Nếu à làm cho không có ý nghĩa, sau đó thử độ mã hóa khác.

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