Unescaping символы в строке с Ruby - PullRequest
3 голосов
/ 13 ноября 2010

Имеется строка в следующем формате (API Posterous возвращает сообщения в этом формате):

s="\\u003Cp\\u003E"

Как я могу преобразовать его в действительные символы ascii, чтобы s="<p>"?

В OSX я успешно использовал Iconv.iconv('ascii', 'java', s), но после развертывания в Heroku я получаю исключение Iconv::IllegalSequence. Я предполагаю, что система, которую развертывает Heroku, не поддерживает кодировщик java.


Я использую HTTParty , чтобы сделать запрос к Posterous API. Если я использую curl для того же запроса, тогда я получаю , а не , получая двойные слэши

Со страницы HTTParty github:

Автоматический анализ JSON и XML в рубиновые хэши, основанные на ответе тип контента

Posterous API возвращает JSON (без двойной косой черты), а JSON-анализ HTTParty вставляет двойную косую черту.


Вот простой пример того, как я использую HTTParty для выполнения запроса.

class Posterous
  include HTTParty
  base_uri "http://www.posterous.com/api/2"
  basic_auth "username", "password"
  format :json
  def get_posts
    response = Posterous.get("/users/me/sites/9876/posts&api_token=1234")
    # snip, see below...
  end
end

При замене очевидной информации (имя пользователя, пароль, site_id, api_token) действительными значениями.

В момент снэпа response.body содержит строку Ruby в формате JSON, а response.parsed_response содержит хеш-объект Ruby, который HTTParty создал путем анализа ответа JSON от Posterous API.

В обоих случаях юникодные последовательности, такие как \u003C, были изменены на \\u003C.

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Я нашел решение этой проблемы. Я столкнулся с этой сущностью . У elskwid была та же проблема, и она пропустила строку через анализатор JSON:

s = ::JSON.parse("\\u003Cp\\u003E")

Теперь s = "<p>".

1 голос
/ 05 декабря 2015

Вы также можете использовать pack:

"a\\u00e4\\u3042".gsub(/\\u(....)/){[$1.hex].pack("U")} # "aäあ"

Или сделать наоборот:

"aäあ".gsub(/[^ -~\n]/){"\\u%04x"%$&.ord} # "a\\u00e4\\u3042"
1 голос
/ 28 апреля 2011

Я столкнулся с этой проблемой на днях. В синтаксическом анализаторе json есть ошибка, которую использует HTTParty (Crack gem) - в основном он использует регистрозависимое регулярное выражение для последовательностей Unicode, поэтому, поскольку Posterous выпускает A-F вместо a-f, Crack не убирает их. Я отправил запрос на удаление, чтобы это исправить.

Тем временем HTTParty позволяет вам указать альтернативные парсеры, чтобы вы могли ::JSON.parse полностью обойти Crack следующим образом:

class JsonParser < HTTParty::Parser
  def json
    ::JSON.parse(body)
  end
end

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end
0 голосов
/ 14 ноября 2010

Двойная обратная косая черта выглядит почти как обычная строка, просматриваемая в отладчике.

Строка "\u003Cp\u003E" на самом деле равна "<p>", только \u003C является Unicode для <, а \003E равно >.

>> "\u003Cp\u003E"  #=> "<p>"

Если вы действительно получаете строку с двойной обратной косой чертой, тогда вы можете попробовать снять одну из пары.

В качестве теста посмотрите, какова длина строки:

>> "\\u003Cp\\u003E".size #=> 13
>> "\u003Cp\u003E".size #=> 3
>> "<p>".size #=> 3

Все вышеизложенное было сделано с использованием Ruby 1.9.2, который поддерживает Unicode. v1.8.7 не было. Вот что я получаю, используя для сравнения IRB 1.8.7:

>> "\u003Cp\u003E" #=> "u003Cpu003E"
...