2012-02-10 4 views
3

Unicode строка:Ruby: юникода строка экранирования в

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. 

Но выход (в файл) по-прежнему совпадает с входом! Любая помощь будет оценена по достоинству.

Edit: Не используя IRB, используя RubyMine и вход обрабатывается в Twitter, поэтому единственный "\u" не "\\u"

Edit 2: RubyMine IDE Output

+1

'' \ u2013 "' является буквальным символом Юникода ... вы имели в виду '' \\ u2013 "'? –

+0

Вы знаете, что это, вероятно, проблема с gsub. Он ищет \ u, а не \ u ... Я не слишком уверен, как исправить :(. \ U2013 "это то, что я разобрал, это не ручной ввод. –

+0

Насколько я могу судить, нет проблема с регулярным выражением или помощником 'unescape_unicode'. В строке, которую вы предоставили (как определено в вопросе), нет ничего, что могло бы быть unescape. Проблема может быть больше в том, как вы пишете это в файл, чем проблема со строкой. –

ответ

4

Вы пытаетесь его от irb, или вывод строки с p?

String#inspect (вызывается из irb и p str) преобразования Юникода символов в формате \uxxxx, чтобы строка, которая будет печататься в любом месте. Кроме того, когда вы вводите "CEO Frye \u2013 response to...", это экранированная последовательность, разрешенная рубиновым синтаксическим анализатором. Это символ юникода в финальной строке.

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

Я отредактирую вопрос. Когда я пишу строку в файл (или строку p), он записывает ее unicode. Не использовать IRB, используя RubyMine IDE. Строка захватывается из твиттера, а не вводится вручную. –

+0

Вы правы Я использую p вместо puts. Спасибо. –

Смежные вопросы