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=="