【问题标题】:What controls the encoding of GET and POST variables?什么控制 GET 和 POST 变量的编码?
【发布时间】:2013-06-12 15:31:33
【问题描述】:

我做了一些测试,当我测试这个时,似乎:

http://127.0.0.1/test.php?x={some non-english string}

http://127.0.0.1/test.php?x=الapple

通过检查输出:

echo bin2hex($_GET["x"]);
  • Firefox & Chrome 中,我得到了字符串d8a7d9846170706c65 的UTF-8 表示。

  • $_GET['x'] 变量。在IE,我得到3f3f6170706c65。这是错误的

而且我知道 PHP 不会改变编码,只将字符串视为字节数组。

问题是:

这是由使用的浏览器控制的吗?

始终假定输入为 UTF-8 编码是否可靠?

有没有办法管理浏览器向服务器发送的编码?跨所有浏览器?

【问题讨论】:

  • 我会说这取决于您如何在 HTML 页面的元数据中设置字符集。不过没有测试。

标签: php string encoding utf-8 get


【解决方案1】:

请求的来源有所不同。

如果是来自用户的输入,例如在浏览器的地址栏中输入 URL,大多数浏览器都会遵循suggestion in RFC 3986 并使用 UTF-8 作为编码:

当一个新的 URI 方案定义了一个表示文本的组件时 由通用字符集 [UCS] 中的字符组成的数据, 数据应首先根据 UTF-8 编码为八位字节 字符编码 [STD63]; […]

虽然这是为新的 URI 方案设计的,但 HTTP 已经很老了。

但是,如果 URL 嵌入到文档中,例如,作为链接或表单操作,则使用文档的编码,除非数据已经使用 URL 编码进行了编码。如果数据编码错误,无效序列可能会被某些字符替换,这些字符应该表示那些无效序列,如 Unicode 中的 (U+FFFD)。同样,无效的编码字符لا 可能已被? 替换,其ASCII 码位为0x3F。

【讨论】:

    【解决方案2】:

    我认为这应该归结为urldecode (http://www.php.net/manual/en/function.urldecode.php) 是如何解释它的,因为$_GET 变量都是通过该函数传递的(参见http://php.net/manual/en/reserved.variables.get.php

    编辑

    要将字符编码为 UTF-8 以便在客户端的 URL 中使用,您可以在 JavaScript 中使用 encodeURI

    对于你给出的例子,你可以做encodeURI('الapple');,它应该返回"%D8%A7%D9%84apple"

    将其提供给 PHP 的 urldecode 函数(因为它会自动)返回原始字符串,并带有以下十六进制输出;

    echo bin2hex(urldecode("%D8%A7%D9%84apple")); //outputs d8a7d9846170706c65
    

    【讨论】:

    • 不,用更多信息编辑问题,说明为什么这不起作用。
    • 为样板评论干杯,说这“行不通”没有任何意义,我只是根据您的原始问题告诉您 PHP 的行为是什么。
    • 对不起,如果我的评论冒犯了你,urldecode 在处理 GET 变量时不需要它,因为它们是自动解码的,我显示了实际的字节数组 (bin2hex) 输出,不同浏览器。
    • 真的吗? $_GET 变量是否自动通过 urldecode 进行解码?别担心,我没有被冒犯:D 我只是不想浪费时间在改变问题和不阅读答案的 OP 上:P
    • 是的,如果您输入这样的网址:file.php?x=%61%62,结果将是$_GET['x'] 的值是'ap',而不需要任何额外的网址解码。
    【解决方案3】:

    是的,有可能!

    对 URL 进行编码:

    <?php
       $url = "http://127.0.0.1/test.php?x=".urlencode("some non-english string");
    ?>
    

    要解码 URL:

    <?php
       $url = urldecode($_GET["x"]);
    ?>
    

    【讨论】:

    • 不,用更多信息编辑问题,说明为什么这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2011-03-29
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多