Rubyを使用した文字列内のキャラクターを解き放ちます
質問
次の形式の文字列が与えられます(この形式の投稿は投稿を返します):
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"