2012-02-10 127 views
3

Unicode字符串:紅寶石:UNESCAPE unicode字符串

string = "CEO Frye \u2013 response to Capitalism discussion in Davos: Vote aggressively with your wallet against firms without social conscience." 

我試圖(通過Is this the best way to unescape unicode escape sequences in Ruby?):

def unescape_unicode(s) 
    s.gsub(/\\u([\da-fA-F]{4})/) {|m| [$1].pack("H*").unpack("n*").pack("U*")} 
end 

unescape_unicode(string) #=> CEO Frye \u2013 response to Capitalism discussion in Davos: Vote aggressively with your wallet against firms without social conscience. 

但輸出(到文件)仍然是相同的輸入!任何幫助,將不勝感激。

編輯: 不使用內部評級法,使用的RubyMine,並輸入來自Twitter的分析,因此單"\u""\\u"

編輯2: RubyMine IDE Output

+1

'「\ u2013」​​'是一個字面的unicode字符......你的意思是''\\ u2013「'? – 2012-02-10 16:00:25

+0

你知道這可能是gsub的問題。它正在尋找\\你,而不是\ü...我不太清楚如何修復:(。「\ u2013」​​是我解析的,它不是手動輸入。 – 2012-02-10 16:57:26

+0

據我所知,沒有問題可能與正則表達式或unescape_unicode助手有關,在你提供的字符串中沒有任何可以忽略的字符(正如問題中所定義的)。問題可能在於你如何將它寫入文件這個字符串有問題 – 2012-02-10 17:03:05

回答

4

你是從irb嘗試它,或輸出字符串爲p

String#inspect(從irbp str調用)將unicode字符轉換爲\uxxxx格式,以允許將字符串打印到任意位置。此外,當您鍵入"CEO Frye \u2013 response to..."時,這是由ruby解析器解析的轉義序列。它是最後一個字符串中的一個Unicode字符。

str1 = "a\u2013b" 
str1.size #=> 3 
str2 = "a\\u2013b" 
str2.size #=> 8 
unescape_unicode(str2) == str1 #=> true 
+0

我將編輯該問題。當我將字符串寫入文件(或p字符串)時,它會將它寫入unicode轉義。不使用IRB,使用RubyMine IDE。字符串是從Twitter中抓取的,而不是手動輸入的。 – 2012-02-10 16:54:18

+0

你說得對,我使用p而不是put。謝謝。 – 2012-02-10 17:45:02