Php base64和ruby的结果不一样

时间:2016-09-15 12:53:03

标签: php ruby base64

我试图通过使用Base64将我的PHP代码转换为ruby,但它们没有给出相同的结果;

PHP代码;

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

echo $user_basket;
?>

输出;

W1siTXkgYmFza2V0IiwiMTguMDAiLDJdXQ==

然后我在ruby中尝试相同的事情;

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

我放了gsub,因为to_json添加了反斜杠

这个输出;

"W1snTXkgYmFza2V0JywnMTguMDAnLDJdXQ==\n" 

修改

问题在于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]]" 

ruby​​添加了反斜杠,这就是我添加gsub以删除反斜杠的原因。

1 个答案:

答案 0 :(得分:2)

Ruby的to_json而不是PHP json_encode都没有向实际字符串添加斜杠。但是,在IRB中打印字符串时,在此显示的表示中添加反斜杠作为valud字符串。但它们不在实际的字符串数据中。

与之相反,@ 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=="