【发布时间】:2010-01-01 19:20:14
【问题描述】:
在我看来,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 的方法。 p>
理想情况下,ruby 的 YAML 应该只用正确的编码注释它转储的字符串。有一个 Ya2YAML 项目试图转储 UTF-8 安全 YAML。我不确定它有多远。如果有人玩过它,我欢迎任何想法。
不管怎样,我仍然有这些转储,没有任何编码信息需要处理。虽然我知道它们都是 UTF-8。
【问题讨论】:
-
重金属变音符号+1。
-
我刚刚遇到了同样的错误/行为......您是否找到了其他解决方案,或者您仍然只是在执行 YAML.load 然后对每个字符串执行 force_encoding('utf-8') ?跨度>
标签: ruby string encoding yaml ruby-1.9