在我看來,紅寶石1.9附帶的YAML庫是encoding-deaf。Ruby 1.9,YAML和字符串編碼:如何過一種理智的生活?
這意味着當生成YAML時,它將接收任何字節的字符串,並轉義任何不輸出乾淨的ASCII的字節序列。這是跛腳的,但可以接受。
我的問題是相反的。從所述YAML轉儲加載內容時。
在下面的示例中,我創建一個UTF-8字符串,將其轉儲,並將其轉儲類型爲!binary
。當我加載它時,它具有編碼ASCII-8BIT。在這個例子的最後,我嘗試用另一個UTF-8字符串連接原始和重新加載的字符串。後者將以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
我想很明顯這將如何迅速引來麻煩,當你處理包含嵌套哈希和數組與葉弦一些YAML源。
目前我有一些遍歷所有哈希和數組的代碼,並在每個字符串上調用force_encoding
。這至少可以說是不美觀的。
什麼我要找的,現在是一種方式告訴YAML::load
是自帶的任何字符串應被視爲,因此有它的編碼設置爲UTF-8。
理想情況下,ruby的YAML應該只註釋它轉儲的字符串以正確的編碼。有一個Ya2YAML項目試圖轉儲UTF-8安全的YAML。我不確定它有多遠。如果有人玩過它,我歡迎任何想法。
無論如何,我仍然有這些轉儲沒有任何編碼信息來處理。雖然我知道他們都是UTF-8。
+1爲重金屬元素變音。 – 2011-04-18 11:42:54
我只是遇到相同的錯誤/行爲...你有沒有找到另一個解決方案,或者你還只是在做每個字符串的YAML.load然後force_encoding('utf-8')? – severin 2012-07-13 12:24:25