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