在我看来,附带红宝石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.9.2.
我发现在1.9.1但不是1.9.2的bug.