2013-12-17 35 views
2

Here您可以閱讀json_decode功能PHP json_decode函數只是工作UTF-8編碼的字符串?

只能用UTF-8編碼字符串的作品。

那麼爲什麼下面的行會導致不同的輸出?

echo utf8_decode('1ñ2'), "\n"; 
echo json_decode('"' . '1ñ2' . '"'), "\n"; 

「N」字是不是一個合法的UTF-8字符,即使如此json_decode時字符傳遞到它必須解碼字符串不抱怨。

+1

「ñ」實際上是一個有效的UTF-8字符。我在這裏沒有得到什麼問題,因爲這些功能做了不同的事情。這是每個人的預期結果。 – Phius

+0

「ñ」必須表示爲一個多字節字符cos,它具有最高有效位集,所以UTF-8字符是'-2',並且這不是有效的UTF-8。 –

回答

2

這是因爲這兩個功能都在做完全不同的東西。雖然json_decode()保持字符編碼原樣(utf-8)並僅將json數據解析爲PHP結構,但utf8_decode()將字符編碼轉換爲ISO-8859-1。但是ISO-8859-1不知道那些特殊的多字節字符。

+0

感謝您的回覆。我同意這些函數做了一個完全不同的東西,我閱讀文檔;)我的觀點是字符串'1ñ2'不是有效的UTF-8字符串(多字節字符'2'不是有效的UTF- 8字符),這就是爲什麼'utf8_decode'「抱怨」,爲什麼'json_decode()'不抱怨?在我看來,json_decode()並不要求字符串是UTF-8,正如文檔所說,可能只需要JSON關鍵字符是UTF-8編碼。 –

+1

如果不是utf-8,它是什麼類型的編碼? AFAIK utf-8定義了世界上任何現有的字符(以及更多:) .. – hek2mgl

+0

大聲笑這是微不足道的,無論如何我會清除它:「有效的UTF-8字符串」=「正確編碼的UTF-8字符串」和「1?2」是不是一個正確編碼的UTF-8字符串,這就是爲什麼'utf8_decode'函數會抱怨的原因。 '1ñ2'='00110001 11000011 00110001',最後16位不構成有效的多字節UTF-8字符,因此最後8位必須以'10'開頭。 PS:我不是一位Unicode專家。 –