我需要生成一个“随机”128字节密钥(此时随机强度并不重要)。我在Javascript中使用以下代码执行此操作:
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 :(得分:7)
Javascripts .charCodeAt()
返回每个字符串字符的Unicode代码点。 Javascript中的字符串使用UCS-2或UTF-16。
另一方面,PHP只将字符串视为字节流。它实际上并不太了解charsets。基本上它默认为字符串ASCII或Latin-1。 (至少它是二元安全的。)
现在通过URL或表单值传输的参数通常被编码为UTF-8。这将适用于PHP,因为UTF-8专门设计用于不知道它存在的系统。
ò
的UTF-8编码为"\xC3\xB2"
。因此,当您使用$string[0]
访问PHP中的第一个字符时,它只会看到第一个字节,即十六进制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?这样的longwinded方法