3

次の形式の文字列を指定します(Posterous APIはこの形式で投稿を返します):

s="\\u003Cp\\u003E"

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

OSXでは、正常に使用しましIconv.iconv('ascii', 'java', s)たが、Herokuにデプロイすると、Iconv::IllegalSequence例外が発生します。Herokuをデプロイするシステムはjavaエンコーダーをサポートしていないと思います。


私はHTTPartyを使用してPosterousAPIにリクエストを送信しています。curlを使用して同じリクエストを行うと、ダブルスラッシュが表示されません。

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

明らかな情報(ユーザー名、パスワード、site_id、api_token)が有効な値に置き換えられます。

snipの時点でresponse.body、JSON形式のRuby文字列がresponse.parsed_response含まれ、PosterousAPIからのJSON応答を解析することによってHTTPartyが作成したRubyハッシュオブジェクトが含まれています。

どちらの場合も、などのユニコードシーケンス\u003Cはに変更されてい\\u003Cます。

4

4 に答える 4

3

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

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

さて、s = "<p>"

于 2010-11-16T20:29:21.883 に答える
1

私は先日、この正確な問題に遭遇しました。HTTPartyが使用するjsonパーサーにはバグがあります(Crack gem)-基本的にはUnicodeシーケンスに大文字と小文字を区別する正規表現を使用します。したがって、PosterousはafではなくAFを出力するため、Crackはそれらをエスケープしません。これを修正するためにプルリクエストを送信しました。

それまでの間、HTTPartyを使用すると、代替パーサーを適切に指定できるため、次::JSON.parseのようにCrackを完全にバイパスできます。

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

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end
于 2011-04-28T03:25:02.607 に答える
1

また、使用することができますpack

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

またはその逆を行うには:

"aäあ".gsub(/[^ -~\n]/){"\\u%04x"%$&.ord} # "a\\u00e4\\u3042"
于 2015-12-05T17:29:06.333 に答える
0

二重の円記号は、デバッガーで表示されている通常の文字列のように見えます。

文字列"\u003Cp\u003E"は実際にはです。はユニコードであり"<p>"、です。\u003C<\003E>

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

本当に2つの円記号が付いた文字列を取得している場合は、ペアの1つを削除してみてください。

テストとして、文字列の長さを確認します。

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

上記はすべて、Unicode対応のRuby1.9.2を使用して行われました。v1.8.7はそうではありませんでした。比較のために1.8.7のIRBを使用して得られるものは次のとおりです。

>> "\u003Cp\u003E" #=> "u003Cpu003E"
于 2010-11-14T01:17:19.143 に答える