質問

次の形式の文字列が与えられます(この形式の投稿は投稿を返します):

s="\\u003Cp\\u003E"

どうすればそれを実際のASCII文字に変換できます。 s="<p>"?

OSXでは、使用しました Iconv.iconv('ascii', 'java', s) しかし、Herokuに展開すると、私はAnを受け取ります Iconv::IllegalSequence 例外。私は、システムヘロクが展開してサポートしていないと推測しています java エンコーダー。


使ってます httparty Posterous APIにリクエストを行うには。私が同じリクエストをするためにカールを使用した場合、私はします いいえ ダブルスラッシュを取得します。

httparty githubページから:

応答コンテンツタイプに基づいて、JSONとXMLのルビーハッシュへの自動解析

Posterous APIはJSON(ダブルスラッシュなし)を返し、HTTPARTYのJSON解析は二重スラッシュを挿入しています。


以下は、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

明らかな情報(username、password、site_id、api_token)が有効な値に置き換えられました。

切り分けの時点で、 response.body JSON形式のルビーストリングが含まれています response.parsed_response Posterous APIからJSON応答を解析することによって作成されたHTTPARTYが作成するRuby Hashオブジェクトが含まれています。

どちらの場合も、次のようなユニコードシーケンス \u003C に変更されました \\u003C.

役に立ちましたか?

解決

先日、私はこの正確な問題に出くわしました。 JSONパーサーには、HTTPARTYが使用するバグ(クラックGEM)があります。基本的には、ユニコードシーケンスに症例に敏感なregexpを使用しているため、afではなくAFを出力するため、亀裂はそれらを無効にしません。これを修正するためにプルリクエストを送信しました。

それまでの間、HTTPARTYでは、あなたができるように代替パーサーを指定することができます ::JSON.parse このように完全に亀裂をバイパスする:

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

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end

他のヒント

この問題の解決策を見つけました。私は出くわしました この要点. 。 Elskwidには同じ問題があり、JSONパーサーを通して文字列を実行しました。

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

今、 s = "<p>".

使用することもできます pack:

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

または逆を行うには:

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

ダブルバックスラッシュは、デバッガーで表示されている通常の文字列のように見えます。

文字列 "\u003Cp\u003E" 本当にそうです "<p>", 、 のみ \u003C UNICODEです <\003E>.

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

2倍のバックスラッシュで文字列を本当に取得している場合は、ペアの1つを削除してみてください。

テストとして、文字列の長さを参照してください。

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

上記のすべては、Unicodeが認識しているRuby 1.9.2を使用して行われました。 V1.8.7はそうではありませんでした。比較のために1.8.7のIRBを使用して得られるものは次のとおりです。

>> "\u003Cp\u003E" #=> "u003Cpu003E"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top