【问题标题】:Does character encoding differ in Javascript and PHP?Javascript 和 PHP 中的字符编码是否不同?
【发布时间】:2012-01-19 20:29:48
【问题描述】:

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

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

【问题讨论】:

  • 如果您不需要 255 个不同的字符,127 应该是最容易使用的,因为 PHP 将字符作为字节的概念。

标签: php javascript encoding character


【解决方案1】:

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

另一方面,PHP 只将字符串视为字节流。它实际上并不了解很多字符集。基本上,它默认考虑字符串 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,然后提取第一个 word 以获得 Unicode 代码点。或者像 How to get code point number for a given character in a utf-8 string? 这样的冗长方法)

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多