Frage

eine Zeichenfolge im folgende Format (die Posterous API gibt Beiträge in diesem Format) Gegeben:

s="\\u003Cp\\u003E"

Wie kann ich es auf das tatsächliche ASCII-Zeichen zu konvertieren, so dass s="<p>"?

Auf OSX, ich erfolgreich eingesetzt Iconv.iconv('ascii', 'java', s) aber einmal Heroku eingesetzt, erhalte ich eine Iconv::IllegalSequence Ausnahme. Ich vermute, dass das System Heroku setzt den java Encoder unterstützen does't.


Ich bin mit HTTParty eine Anfrage an die Posterous API zu machen. Wenn ich curl verwenden die gleiche Anfrage zu machen, dann muss ich nicht die doppelte Schrägstriche erhalten.

Von HTTParty Github Seite:

Automatische Parsen von JSON und XML in Rubin Hashes basiert auf Antwort content-type

Die Posterous API gibt JSON (keine doppelten Schrägstriche) und HTTParty JSON Parsen den doppelten Schrägstrich eingefügt wird.


Hier ist ein einfaches Beispiel für die Art, wie ich HTTParty bin mit dem Antrag zu stellen.

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

Mit den offensichtlichen Informationen (Benutzername, Passwort, site_id, api_token) ersetzt mit gültigen Werten.

Am Punkt der Snip, response.body enthält eine Zeichenfolge, die in Ruby-JSON-Format ist und response.parsed_response enthält ein Hash-Objekt, das Rubin HTTParty erstellt, indem die JSON Antwort von dem Posterous API Parsen.

In beiden Fällen sind die Unicode-Sequenzen, wie \u003C haben \\u003C geändert.

War es hilfreich?

Lösung

Ich lief in genau dieses Problem den anderen Tag. Es ist ein Fehler in dem json-Parser, dass HTTParty verwendet (Riss gem) - im Grunde verwendet es einen Fall empfindlichen regexp für die Unicode-Sequenzen, so da Posterous puts out A-F anstelle von a-f, Riss ist sie nicht URL-Kodierung. Ich legte eine Pull-Anforderung zu beheben diese.

In der Zwischenzeit HTTParty schön können Sie alternative Parser angeben, so dass Sie ::JSON.parse tun können ganz Sprung wie diese unter Umgehung:

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

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end

Andere Tipps

Ich habe eine Lösung für dieses Problem gefunden. Ich lief über diesen Kern . elskwid hatte das gleiche Problem und lief die Zeichenfolge durch einen JSON-Parser:

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

Nun s = "<p>".

Sie können auch pack verwenden:

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

oder umgekehrt zu tun:

"aäあ".gsub(/[^ -~\n]/){"\\u%04x"%$&.ord} # "a\\u00e4\\u3042"

Die verdoppelten-Schrägstriche sehen fast wie eine normale Zeichenfolge in einem Debugger betrachtet wird.

Der String "\u003Cp\u003E" wirklich "<p>" ist, wird nur die \u003C ist Unicode für < und \003E > ist.

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

Wenn Sie wirklich sind, um die Zeichenfolge mit doppelten Schrägstrichen immer dann könnte man versuchen, ein von dem Paar Strippen.

Als Test sehen, wie lange die Zeichenfolge:

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

Alle oben getan wurde mit Ruby 1.9.2, die Unicode bewusst ist. v1.8.7 war es nicht. Hier ist, was ich bekommen 1.8.7 IRB für den Vergleich mit:

>> "\u003Cp\u003E" #=> "u003Cpu003E"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top