Dường như với tôi thư viện YAML đi kèm với ruby 1.9 bị điếc.Ruby 1.9, YAML, và mã hóa chuỗi: làm thế nào để sống một cuộc sống của sự tỉnh táo?
Điều này có nghĩa là khi tạo YAML, nó sẽ lấy bất kỳ chuỗi byte nào và thoát khỏi bất kỳ chuỗi byte nào không xuất ra ASCII sạch. Đó là lame, nhưng chấp nhận được.
Vấn đề của tôi là một cách khác. Khi tải nội dung từ YAML dump nói.
Trong ví dụ sau tôi tạo chuỗi UTF-8, đổ nó, nó được bán với loại !binary
. Khi tôi tải nó trở lại, nó có mã ASCII-8BIT. Trong phần cuối của ví dụ, tôi cố gắng nối cả chuỗi gốc và chuỗi được tải lại với một chuỗi UTF-8 khác. Sau này sẽ thất bại với một Encoding::CompatibilityError
.
require 'yaml'
s0 = "Iñtërnâtiônàlizætiøn"
y = s0.to_yaml
s1 = YAML::load y
puts s0 # => Iñtërnâtiônàlizætiøn
puts s0.encoding # => UTF-8
puts s1 # => Iñtërnâtiônàlizætiøn
puts s1.encoding # => ASCII-8BIT
puts y # => --- !binary |
# ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu
puts "ñårƒ" + s0 # => ñårƒIñtërnâtiônàlizætiøn
puts "ñårƒ" + s1 # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
Tôi nghĩ rõ ràng điều này sẽ nhanh chóng dẫn đến rắc rối khi bạn xử lý một số nguồn YAML có chứa chuỗi lồng và mảng lồng nhau.
Hiện tại tôi có một số mã đi qua tất cả các mảng và mảng và gọi force_encoding
trên mỗi chuỗi. Điều đó, để nói rằng ít nhất, là khó coi.
Điều tôi đang tìm kiếm ngay bây giờ là cách để báo cho YAML::load
rằng bất kỳ chuỗi nào có trong đó phải được xử lý và do đó mã hóa được đặt thành UTF-8.
Lý tưởng nhất, YAML của Ruby nên chỉ chú thích các chuỗi nó đổ bằng mã hóa thích hợp. Có một dự án Ya2YAML cố gắng để kết xuất YAMF-8 YAML an toàn. Tôi không chắc nó ở xa bao xa. Nếu có ai chơi với nó, tôi hoan nghênh mọi suy nghĩ.
Bất kể điều đó, tôi vẫn có các bãi chứa này mà không cần bất kỳ thông tin mã hóa nào để xử lý. Mặc dù tôi biết họ đều là UTF-8.
+1 cho umlauts kim loại nặng. –
Tôi chỉ chạy vào cùng một lỗi/hành vi ... Bạn đã tìm thấy một giải pháp khác hay bạn vẫn chỉ làm YAML.load và sau đó force_encoding ('utf-8') trên mỗi chuỗi? – severin