2013-10-09 15 views
5

Các múi giờ cho (ngày) -times và mã hóa cho chuỗi không có vấn đề nếu bạn không có chuyển đổi giữa chúng. Trong Ruby 1.9 và 2.0, các mã hóa dường như là các múi giờ mới từ các phiên bản Ruby cũ hơn, chúng không gây ra gì ngoài rắc rối. Iconv đã được thay thế bằng các chức năng mã hóa gốc. Làm cách nào để chuyển đổi từ tiêu chuẩn UTF-8 sang ISO-8859-1, ví dụ như để sử dụng trong các hệ thống Windows? Trong giao diện điều khiển Ruby 2.0, encode function không hoạt động, mặc dù nó có thể chuyển đổi từ mã hóa nguồn sang mã hóa đích thông qua encode(dst_encoding, src_encoding) → str?Làm thế nào để chuyển đổi UTF-8 thành ISO-8859-1 trong Ruby 2.0?

>> "ABC äöüÄÖÜ".encoding 
=> #<Encoding:UTF-8> 
>> "ABC äöüÄÖÜ".encode("UTF-8").encode("ISO-8859-1") 
=> "ABC \xE4\xF6\xFC\xC4\xD6\xDC" 
>> "ABC äöüÄÖÜ".encode("ISO-8859-1","UTF-8") 
=> "ABC \xE4\xF6\xFC\xC4\xD6\xDC" 

Tôi đang sử dụng Ruby 2.0.0 (bản sửa đổi 41674) trên hệ thống Linux.

+1

Có vấn đề gì? '" ABC äöüÄÖÜ ".encode (" ISO-8859-1 "," UTF-8 ")' chuyển đổi UTF-8 sang Latin-1 và trả về chuỗi Latin-1, '" ABC äöüÄÖÜ "' đã là UTF-8 do đó đối số thứ hai để 'mã hóa' là không liên quan. Bạn đang mong đợi điều gì "kỳ vọng" (ISO-8859-1 "," UTF-8 ")' để làm và kỳ vọng của bạn khác với điều gì xảy ra? –

+0

Chuỗi "ABC \ xE4 \ xF6 \ xFC \ xC4 \ xD6 \ xDC" không giống như một văn bản có mã hóa hợp lệ với tôi, hay không? Ít nhất các ký tự đặc biệt không được hiển thị chính xác. Mục đích là để chuyển đổi chuỗi UTF-8 cho một nhập khẩu Excel. Cho đến nay nó dường như không hoạt động tốt. Ý tưởng là nếu tôi quản lý để chuyển đổi UTF-8 sang ISO-8859-1, thì Excel cũng sẽ nhập và hiển thị các văn bản trên Windows. – 0x4a6f4672

+1

Đó là chuỗi mã hóa Latin-1 được hiển thị trong thiết bị đầu cuối UTF-8. –

Trả lời

7

Phương thức encodelàm hoạt động.

Hãy tạo một chuỗi với U + 00FC (ü):

uuml_utf8 = "\u00FC"  #=> "ü" 

của Ruby mã hóa chuỗi này trong UTF-8:

uuml_utf8.encoding   #=> #<Encoding:UTF-8> 

Trong UTF-8, ü được biểu diễn dưới dạng 195188 (thập phân):

uuml_utf8.bytes   #=> [195, 188] 

Không w chúng ta hãy chuyển đổi chuỗi ISO-8859-1:

uuml_latin1 = uuml_utf8.encode("ISO-8859-1") 

uuml_latin1.encoding  #=> #<Encoding:ISO-8859-1> 

Trong tiêu chuẩn ISO-8859-1, ü được biểu diễn dưới dạng 252 (thập phân):

uuml_latin1.bytes   #=> [252] 

Trong UTF-8 tuy nhiên 252 là một chuỗi không hợp lệ. Đó là lý do tại sao thiết bị đầu cuối/bảng điều khiển của bạn hiển thị ký tự thay thế " " (U + FFFD) hoặc không có ký tự nào cả.

Để hiển thị các ký tự được mã hóa ISO-8859-1, bạn cũng sẽ phải chuyển thiết bị đầu cuối/bảng điều khiển của mình sang mã hóa đó.

+0

Có, nhưng trong ví dụ uuml_latin1 của bạn có giá trị "\ xFC" chứ không phải ký tự đặc biệt "ü". 'in uuml_latin1' cho , trong khi 'đặt uuml_latin1' tạo ra một chuỗi rỗng. Có điều gì đó sai, hoặc là các hàm Ruby không thể hiển thị mã hóa ISO-8859-1? – 0x4a6f4672

+0

0xFC thực sự là giá trị hex cho 252. Điều này có nghĩa là Ruby 2.0 không thể hiển thị các chuỗi với mã hóa ISO-8859-1 một cách chính xác, sử dụng các ký tự phù hợp? Tại sao nó hoạt động với mã hóa UTF-8, nhưng không hoạt động với mã hóa ISO-8859-1? – 0x4a6f4672

+0

Ruby không * hiển thị * các chuỗi, thiết bị đầu cuối của bạn thực hiện. Thay đổi nó từ UTF-8 thành ISO-8859-1 và bạn sẽ thấy 'ü'. – Stefan

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