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

Jul*_*les 2 javascript php encoding character

我需要生成一个"随机"128字节密钥(此时随机强度并不重要).我在Javascript中使用以下代码执行此操作:

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

但是,当我通过POST将此密钥发送到PHP脚本时,我发现我的密钥中的某些字符没有相同的编码!例如,当我在Javascript中输出ò的编码时,我得到254,但是相同的字符在PHP中的编码为195.

某些字符(如AZ,az和0-9)在Javascript和PHP中具有相同的编码.

要输出字符代码,我使用Javascript的.charCodeAt()方法和PHP的ord()函数.

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

mar*_*rio 7

Javascripts .charCodeAt()为每个字符串字符返回Unicode代码点.Javascript中的字符串使用UCS-2或UTF-16.

另一方面,PHP仅将字符串视为字节流.它实际上并不太了解charsets.基本上它默认为字符串ASCII或Latin-1.(至少它是二进制安全的.)

现在通过URL或表单值传输的参数通常被编码为UTF-8.这将在PHP中运行,因为UTF-8专门设计用于不知道其存在的系统.

UTF-8编码ò"\xC3\xB2".因此,当您使用PHP访问第一个字符时,$string[0]它只会看到第一个字节,即十六进制C3或十进制195.

mb_string如果需要,PHP 中的函数可以处理UTF-8等.(此处的解决方法是将字符串从UTF-8转换为UCS-2,然后提取第一个单词以获取Unicode代码点.或者如何获取utf-8字符串中给定字符的代码点编号等longwinded方法)