gpt4 book ai didi

PHP UTF 编码的 URL 字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:58 24 4
gpt4 key购买 nike

当我在 Firefox 中(在地址行中)键入 URL,如 http://www.example.com/?query=Траливали , 它会自动编码为 http://www.example.com/?query=%D2%F0%E0%EB%E8%E2%E0%EB%E8 .

但是 URL 像 http://www.example.com/#ajax_call?query=Траливали未转换。

IE8等其他浏览器根本不转换query。

问题是:如何检测(在 PHP 中)查询是否已编码?如何解码?

我试过:

  1. $str = iconv('cp1251', 'utf-8', urldecode($str) );

  2. $str = utf8_decode(urldecode($str));

  3. $str = (urldecode($str));

  4. 许多功能来自 http://php.net/manual/en/function.urldecode.php什么都没用。

测试:

$str = $_GET['str'];

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urldecode('%D2%F0%E0%EB%E8%E2%E0%EB%E8'));

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == $str);

d('Траливали' == $str);

d(urldecode($str));

d(utf8_decode(urldecode($str)));

!!! d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urlencode($str)); !!!

返回:

[假][错误的][错误的] �������� ???[真实]

某种解决方案:http://www.example.com/Траливали/ - 将查询作为 url 部分发送并使用 mod_rewrite 进行解析。

最佳答案

在片段无效后,它不会被转换为具有 URL 的 query 部分。

RFC 3986将 URI 定义为由以下部分组成:

     foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment

不能更改顺序。因此,

URL1: http://www.example.com/?query=Траливали#ajax_call

将被妥善处理而

URL2: http://www.example.com/#ajax_call?query=Траливали

不会。如果我们查看 URL2,IE 实际上会通过将片段检测为 #ajax_call?query=Траливали 来正确处理 URL,而无需查询。片段总是最后并且永远不会发送到服务器

IE 将正确编码 URL1 的查询部分,因为它会将其检测为查询。

对于 PHP 中的解码,%D2 和类似的代码会在 $_GET['query'] 变量中自动解码。 $_GET 变量没有正确填充的原因是因为在URL2 中,没有按照标准进行查询。

另外,还有最后一件事...当执行 'Траливали' == $_GET['query'] 时,只有当您的 PHP 脚本本身以 UTF-8 编码时才会如此。您的文本编辑器应该能够告诉您文件的编码。

关于PHP UTF 编码的 URL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3368447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com