добавление обратной косой черты для исправления кодировки символов в строке ruby - PullRequest
2 голосов
/ 27 июля 2011

Я уверен, что это очень легко, но я завязан в узел со всеми этими обратными слешами.

У меня есть некоторые данные, которые я вежливо собираю с веб-сайта. Иногда мне приходит предложение, похожее на это:

u00a362 000? you must be joking

Что, конечно, должно быть £ 2 000? ты, должно быть, шутишь'. Короткий тест в irb расшифровал его.

ruby-1.9.2-p180 :001 > string = "u00a3"
  => "u00a3" 
ruby-1.9.2-p180 :002 > string = "\u00a3"
  => "£" 

Конечно: добавьте обратную косую черту, и она будет декодирована. С помощью я создал следующее :

puts str.gsub('u00', '\\u00') 

, что привело к выводу \u00a3. Это все хорошо, но я хочу, чтобы это было в самой строке. просто puts этого недостаточно.

Это бесполезно делать gsub('u00a3', '£'), так как, несомненно, будут другие персонажи, по которым я скучаю.

спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Внимание, следующее не очень красиво.

str = "u00a362 000? you must be joking"
split_unicode = str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/)
final = split_unicode.map do |elem|
  if elem =~ /^u00/
    [("0x" + elem.gsub(/u00/, '')).hex].pack("U*")
  else
    elem
  end
end
puts final.join

Итак, идея в том, чтобы найти u00xx значения и преобразовать их в шестнадцатеричное.Оттуда мы можем использовать метод pack для вывода правильных символов Юникода.

Его также можно сжать в ужасной однострочной!* Возможно, есть лучшее решение (надеюсь!), Но оно работает.

0 голосов
/ 27 июля 2011

Попробуйте библиотеку Iconv для преобразования входящей строки.Вы также можете взглянуть на камень stringex.У него есть методы «пойти другим путем», но он может обеспечить сопоставления, которые вы ищете.Тем не менее, если у вас плохое кодирование, может быть невозможно сделать это правильно.

...