Ruby 1.9,YAML和字符串编码:如何引领理性的生活?

在我看来,附带红宝石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.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...