Javascript和PHP中的字符编码有所不同吗?

时间:2011-12-14 00:25:12

标签: php javascript encoding character

我需要生成一个“随机”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()函数。

我希望有人可以向我解释为什么字符编码不同。谢谢!

1 个答案:

答案 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方法