2011-12-14 51 views
2

我需要生成一個「隨機」128字節的密鑰(隨機強度此刻不重要)。我這樣做在Javascript與下面的代碼:JavaScript和PHP中的字符編碼有區別嗎?

var buffer = ""; 
for(var i=0; i<128; i++) 
{ 
    buffer += String.fromCharCode(Math.round(Math.random()*255)); 
} 

然而,當我發送此項通過POST PHP腳本,我發現,在我的鑰匙某些字符不具有相同的編碼!例如,當我在Javascript中輸出ò的編碼時,我得到254,但同一個字符在PHP中的編碼爲195。

某些字符,如A-Z,a-z和0-9在Javascript和PHP中都有相同的編碼。

要輸出字符代碼,我使用Javascript的.charCodeAt()方法和PHP的ord()函數。

我希望有人能向我解釋爲什麼字符編碼不同。謝謝!

+0

如果你不需要255個字符的不同由於PHP的chars字節爲字節,因此'127'應該是最容易使用的。 – alex

回答

7

Javascripts .charCodeAt()返回每個字符串字符的Unicode代碼點。 Javascript中的字符串使用UCS-2或UTF-16。

另一方面,PHP僅將字符串視爲字節流。它實際上並不知道很多字符集。基本上它認爲字符串ASCII或拉丁-1默認。 (至少是二進制安全的)。

現在通過URL或表單值傳輸的參數通常會被編碼爲UTF-8。這將在PHP中起作用,因爲UTF-8專門設計用於不知道其存在的系統。

ò的UTF-8編碼是"\xC3\xB2"。因此,當您訪問PHP中的第一個字符$string[0]時,它只會看到第一個字節,即十六進制C3或十進制195

在PHP中有mb_string函數,但是如果你需要的話可以處理UTF-8等。 (這裏的解決方法是將字符串從UTF-8轉換爲UCS-2,然後提取第一得到Unicode碼點。或者冗長的方法,如How to get code point number for a given character in a utf-8 string?

+1

絕妙的答案。 – alex

+0

最好的部分是,我知道所有這一切。 – mario

+0

忘了謝謝你這個美好的回答。再次感謝! – Jules