【问题标题】:Working around unexpected behavior in yaml for Ruby -- interned unicode strings为 Ruby 解决 yaml 中的意外行为——interned unicode 字符串
【发布时间】: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


【解决方案1】:

我也是 1.9 的新手,但有时您似乎必须将编码添加到文件顶部。类似的东西:

# encoding: utf-8

再次...不知道何时或为什么。仍然需要学习它在 1.9 中是如何工作的。我在这里找到了更多背景信息:“Ruby 1.9 Common Problems Pt. 1: Encoding”。

【讨论】:

  • 添加注释行真的有效吗?编译器真的会解析吗?
  • 我添加了一个指向与此相关的博客文章的链接。所以是的,编译器似乎明白这一点。不过不知道能不能解决你的问题。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2021-06-13
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多