加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:04:46 所属栏目:百科 来源:网络整理
导读:在我看来,附带红宝石1.9的YAML图书馆是编码聋. 这意味着,当生成YAML时,它将使用任何字符串,并转义任何不输出干净ASCII的字节序列.这是跛脚,但可以接受. 我的问题是相反的.从YAML转储中加载内容时. 在下面的示例中,我创建一个UTF-8字符串,转储它,它将转储为类
在我看来,附带红宝石1.9的YAML图书馆是编码聋.

这意味着,当生成YAML时,它将使用任何字符串,并转义任何不输出干净ASCII的字节序列.这是跛脚,但可以接受.

我的问题是相反的.从YAML转储中加载内容时.

在下面的示例中,我创建一个UTF-8字符串,转储它,它将转储为类型!binary.当我加载它,它具有编码ASCII-8BIT.在本例的最后,我尝试将原始和重新加载的字符串与另一个UTF-8字符串相连接.后者将失败,并出现Encoding :: CompatibilityError.

require 'yaml'
s0 = "I?t?rnati?nàliz?ti?n"
y  = s0.to_yaml
s1 = YAML::load y
puts s0                 # => I?t?rnati?nàliz?ti?n
puts s0.encoding        # => UTF-8
puts s1                 # => I?t?rnati?nàliz?ti?n
puts s1.encoding        # => ASCII-8BIT
puts y                  # => --- !binary |
                        #    ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu
puts "??r?" + s0        # => ??r?I?t?rnati?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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读