【发布时间】:2011-04-11 05:53:52
【问题描述】:
(Windows 上为 1.9)
复制:
require 'yaml'
s = YAML::load("\xEC\x86\x8C\xEB\x85\x80\xEC\x8B\x9C\xEB\x8C\x80")
# => "∞åîδàÇ∞ï£δîÇ" or "소녀시대", depending on your terminal's unicode support
s_interned = s.intern
s_interned.class # => Symbol
s_yamld = s_interned.to_yaml
# => "--- \":\\xEC\\x86\\x8C\\xEB\\x85\\x80\\xEC\\x8B\\x9C\\xEB\\x8C\\x80\"\n"
unyamld = YAML::load(s_yamld)
# => ":∞åîδàÇ∞ï£δîÇ" or ":소녀시대"
unyamld.class # => String
# => expected: Symbol
再一次:
YAML::load(s_interned.to_yaml).class # => String
这是“正常”符号的行为方式:
YAML::load(:foo.to_yaml).class # => Symbol
普通符号表现良好,但带有 unicode 字符的符号似乎不行。它们被解释为以冒号作为第一个字符的字符串。
我很确定这个脚本昨晚可以正常工作。但是我今天早上醒来,一切都出了问题。
有谁知道我可以如何解决这个问题或解决这个问题?
我尝试使用一些聪明的正则表达式/子技巧来解决这个问题并“重新转换”,但它们都被证明不优雅或使情况变得更糟。
【问题讨论】:
-
你的文件编码是什么?您的默认外部编码是什么?由于您使用的是 Ruby 1.9(假设为 1.9.2),您可以使用 .encoding 检查编码。
-
@Luis 我是 1.9 的新手,所以编码对我来说很陌生。
s是 UTF-8;s_yamld是 ASCII-8BIT。unyamld是 UTF-8。
标签: ruby serialization yaml symbols