Php base64和ruby的结果不一样


Php base64 and ruby are not the same result

我试图通过使用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]]

在ruby中;

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

ruby添加反斜杠,这就是为什么我添加gsub来删除反斜杠。

Ruby的to_json和PHP的json_encode都没有在实际字符串中添加反斜杠。但是,当在IRB中打印字符串时,将在显示的表示形式中添加反斜杠,使其成为有值字符串。但是,它们不在实际的字符串数据中。

与@Neat在评论中所说的相反,Ruby也没有在其JSON输出中添加single-quites。然而,在原始代码中,由于您使用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=="