2010-09-16 57 views
12

我在PHP中使用json_encode來編碼URL爲什麼JSON編碼器在編碼URL時添加了轉義字符?

$json_string = array ('myUrl'=> 'http://example.com'); 
echo json_encode ($json_string); 

上面的代碼生成以下JSON字符串:

{"myUrl":"http:\/\/example.com"} 

{"myUrl":"http://example.com"} 

我只是新手相反,這輸出是否正確? JSON解析器能夠正確評估第二個輸出嗎?

回答

8

我的猜測是,該函數的編寫者添加了不必要的編碼,只不過是簡單的無知。轉義正斜槓是而不是必需的。

我所知道的令人驚訝的大量程序員同樣與世界其他地方保持一致。而且,編碼和解碼正確的話,真的很差。

更新:

做一些搜索後,我碰到this discussion。它提出了一個很好的觀點,即對於錯誤的HTML解析器有時需要轉義/。我遇到一個問題,一旦在當IE 6不正確地處理了這樣的內容:

<script> 
    var json = { scriptString: "<script> /* JavaScript here */ </script>" }; 
</script> 

IE 6會看到字符串內的</script>和太早收出腳本標籤。因此,這更是IE 6安全(儘管在字符串中的起始腳本標籤也有可能打破東西......我不記得了):

<script> 
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" }; 
</script> 

而且他們也說一些不好的解析器會看到//http://並將其餘部分視爲JavaScript評論。

因此,看起來這是互聯網技術被瀏覽器失敗劫持的又一例。

+1

我同意。但值得注意的是,結果字符串*是有效的。在javascript字符串中,您可以通過在反斜槓前面加上* any *字符來轉義。所以「\ /」被Javascript解釋爲簡單的'/'。 – Lee 2010-09-16 02:30:55

+1

JSON與JavaScript不一樣。在JSON中,你不允許反斜槓任何你喜歡的。但奇怪的是,你可以在一個字符串中反斜槓,所以它仍然有效。 :) – hobbs 2010-09-16 04:58:05

9

根據http://www.json.org/,應該轉義字符,雖然它並非絕對必要在JavaScript:

strings

也閱讀了本related bug report上php.net了簡短的討論。

參見RFC 2.5:

所有Unicode字符可放置 引號內除了 必須轉義字符: 引號,反向固相線,並且 控制字符( U + 0000到 U + 001F)。

任何字符都可能被轉義。

所以這聽起來並不像它需要進行轉義,但它可以是,和網站(以及RFC文本圖)是它被轉義。

-2

我在這裏看到另一個問題。字符串結果{"myUrl":"http://example.com"}不應具有引用的成員名稱myUrl。在JavaScript和JSON中,我認爲所有的對象文字成員id都是不帶引號的字符串。所以,我期望的結果是{myUrl:"http://example.com"}

這看起來PHP太大了,所以我一定是錯的。

編輯,2/11/11:是的,我錯了。 JSON語法甚至需要將字段名稱用雙引號引起來。

4

如果您使用的是PHP 5.4,則可以使用json_encode選項。請參閱manual

在5.3中增加了幾個選項,但在5.4中增加了JSON_UNESCAPED_SLASHES