2016-09-15 11 views
-2

私はBase64を使って自分のPHPコードをRubyに変換しようとしていますが、同じ結果は得られません。php base64とrubyは同じ結果ではありません

PHPコード。

<?php 
$user_basket = base64_encode(json_encode(array(array("My basket", "18.00", 2)))); 

echo $user_basket; 
?> 

出力します。

W1siTXkgYmFza2V0IiwiMTguMDAiLDJdXQ== 

次に同じことをルビーで試してみます。

user_basket = Base64.encode64((([["My basket", "18.00", 2]]).to_json).gsub!(/\"/, '\'')) 

to_jsonバックスラッシュが追加されますので、私はGSUBを置きます。

この出力は、

"W1snTXkgYmFza2V0JywnMTguMDAnLDJdXQ==\n" 

EDIT:

問題がto_jsonを会話です。 PHPの出力は次のとおりです。

json_encode(array(array("My basket", "18.00", 2))) 
>> [["My basket","18.00",2]] 

ルビーで;

([["My basket", "18.00", 2]]).to_json 
>> "[[\"My basket\",\"18.00\",2]]" 

ルビーはバックスラッシュを追加しているため、バックスラッシュを削除するためにgsubを追加しています。

+0

'json_econde()'と '。 to_json'は同じ文字列出力を生成しますか?私はルビに慣れていませんが、 '.to_json.gsub '('?)は括弧が多すぎるように見えますか? – MonkeyZeus

+1

出力の違いは、あなたのルビーが一重引用符を使用し、phpが二重引用符を使用するためです。 '' [{"My basket"、 "18.00"、2]] '、 ルビー:' [[マイバスケット]、 '18.00'、2]] ' – Neat

+0

どうすれば一重引用符を –

答えて

2

Rubyのto_jsonではなく、PHPのjson_encodeでは、実際の文字列にスラッシュが追加されていません。ただし、文字列をIRBに印刷すると、この表示された表現に円記号が追加されます。しかし、実際の文字列データには含まれていません。

@Neatがコメントしたこととは対照的に、RubyはJSON出力にシングルクォートを追加していません。しかし、元のコードでは、すべてのリテラル二重引用符文字を一重引用符文字で置き換えているので、gsub!が存在します。

おそらく、あなたのPHPバージョンで実際のjson_encodeコールを忘れていることが、混乱の原因です。実際のコードを実行する場合、両方のバージョンが正確に同じ文字列を生成する:

PHP> json_encode(array(array("My basket", "18.00", 2))); 
# => "[[\"My basket\",\"18.00\",2]]" 

RUBY> [["My basket", "18.00", 2]].to_json 
# => "[[\"My basket\",\"18.00\",2]]" 

BASE64として文字列をコードする、結果は、このようにも同じである。

PHP> base64_encode(json_encode(array(array("My basket", "18.00", 2)))); 
# => "W1siTXkgYmFza2V0IiwiMTguMDAiLDJdXQ==" 

RUBY> Base64.strict_encode64 [["My basket", "18.00", 2]].to_json 
# => "W1siTXkgYmFza2V0IiwiMTguMDAiLDJdXQ==" 
関連する問題