2010-09-12 30 views
2

在YAML周圍的意外行爲的工作對Ruby - 實習Unicode字符串(在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字符的符號似乎不是。他們被解釋爲帶冒號作爲第一個字符的字符串。

我很確定這個腳本昨晚工作。但今天早上我醒了,一切都出了問題。

有誰知道我該如何解決這個問題或解決這個問題?

我試過使用一些聰明的正則表達式/子黑客來解決這個問題,並「重新」,但他們都證明不雅或使情況變得更糟。

+0

什麼是您的文件enconding?什麼是您的默認外部編碼?由於您使用的是Ruby 1.9(假設1.9.2),您可以使用.encoding檢查編碼。 – 2010-09-12 03:45:57

+0

@Luis我是全新的1.9,所以編碼的東西對我來說很陌生。 's'是UTF-8; 's_yamld'是ASCII-8BIT。 'unyamld'是UTF-8。 – 2010-09-12 06:15:07

回答

0

我是1.9的新手,但看起來你必須在文件頂部添加編碼。例如:

# encoding: utf-8 

再次...不知道何時或爲什麼。還需要了解它在1.9中的工作原理。我在這裏找到了更多的背景信息:「Ruby 1.9 Common Problems Pt. 1: Encoding」。

+0

添加該註釋行真的有用嗎?編譯器是否實際解析它? – 2010-09-12 21:21:49

+0

我在這篇文章中添加了一篇關於博客文章的鏈接。所以是的,似乎編譯器明白這一點。不知道它是否能解決你的問題。 – Cimm 2010-09-13 08:01:46

相關問題