2016-09-15 36 views
-2

我想通過使用Base64將我的PHP代碼轉換爲紅寶石,但他們不給出相同的結果;PHP的base64和紅寶石是不一樣的結果

PHP code;

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

echo $user_basket; 
?> 

which outputs;

W1siTXkgYmFza2V0IiwiMTguMDAiLDJdXQ== 

然後我在紅寶石中嘗試同樣的事情;

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刪除反斜槓。

+0

'json_econde()'和'。 to_json'產生相同的字符串輸出?我不熟悉ruby,但它不應該是'.to_json.gsub!('?它看起來像括號太多了嗎? – MonkeyZeus

+1

輸出的差異是因爲你的ruby使用單引號而php使用雙引號,這些是解碼:PHP:'[[「My basket」,「18.00」,2]],' RUBY:'[['My basket','18.00',2]]' – Neat

+0

那麼我怎樣才能用單引號替換雙引號? –

回答

2

Ruby的to_json不是PHP的json_encode加斜槓到實際的字符串。但是,在IRB中打印字符串時,在此顯示的表示中將反斜槓添加爲一個valud字符串。但它們不在實際的字符串數據中。

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