Ruby 1.9,YAML和字符串编码:如何过一种理智的生活?

kch*_*kch 13 ruby string encoding yaml ruby-1.9

在我看来,带有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
Run Code Online (Sandbox Code Playgroud)

我想很清楚当你处理一些包含嵌套哈希和带叶子串的数组的YAML源时,这会很快导致麻烦.

目前我有一些代码遍历所有哈希和数组并调用force_encoding每个字符串.至少可以说,这是不雅观的.

我现在正在寻找的是一种方法来告诉YAML::load任何进来的字符串应该被视为,因此其编码设置为UTF-8.


理想情况下,ruby的YAML应该使用正确的编码来注释它转储的字符串.有一个Ya2YAML项目试图转储UTF-8安全YAML.我不确定它有多远.如果有人玩过它,我欢迎任何想法.

无论如何,我仍然有这些转储没有任何编码信息来处理.虽然我知道它们都是UTF-8.

Dub*_*arf 1

首先,您尝试读取的文本文件必须是 UTF-8 编码的(这应该是您的 YAML 文件)。

然后将此行添加到您的 ruby​​ 文件、哈希值和所有内容的顶部

# encoding: UTF-8
Run Code Online (Sandbox Code Playgroud)

这意味着所有字符串的默认编码都将是 UTF-8,并且应该意味着使用 YAML.dump('text') 转储的任何文本甚至“像这样”的字符串文字也应该编码为 UTF-8,并且从现在开始一切都应该运转良好。