2012-02-10 11 views
3

Unicode文字列:ルビー:アンエスケープ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. 

しかし、出力(ファイル)がまだ入力と同じです!どんな助けもありがとう。

編集: はルビーマインを使用して、IRBを使用して、入力がツイッターから解析され、それゆえ単一"\u"ない"\\u"

編集2ない: RubyMine IDE Output

+1

'" \ u2013 "'はリテラルのUnicode文字です... "\\ u2013" 'を意味しましたか? –

+0

あなたはそれがおそらくgsubの問題であることを知っています。それは\ uuではなく、\ uを探しています...私はあまりにも修正する方法がわかりません:("\ u2013"は私が解析したもので、手動入力ではありません) –

+0

私が言うことができる限り、正規表現や 'unescape_unicode'ヘルパーの問題です。あなたが提供した文字列にエスケープするものはありません。(質問に定義されているように)問題は、これをファイルに書く方法文字列に問題があります –

答えて

4

あなたはirbからそれをしようとしていますかpで文字列を出力しますか?

String#inspectirbおよびp str)は、ユニコード文字を\uxxxx形式に変換して、文字列をどこにでも印刷できるようにします。また、"CEO Frye \u2013 response to..."と入力すると、これはルビパーサーによって解決されたエスケープシーケンスです。これは、最後の文字列のUnicode文字です。

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

質問を編集します。文字列をファイル(またはp文字列)に書き込むと、その文字列をエスケープして書き込みます。 RubyMine IDEを使用して、IRBを使用しません。文字列は、手動で入力されていないツイッターから取得されています。 –

+0

あなたは正しいです。私はputsの代わりにpを使用しています。ありがとうございました。 –

関連する問題