【发布时间】:2010-07-30 02:57:27
【问题描述】:
当我在 Firefox(地址行)中输入 http://www.example.com/?query=Траливали 之类的 URL 时,它会自动编码为 http://www.example.com/?query=%D2%F0%E0%EB%E8%E2%E0%EB%E8。
但是像http://www.example.com/#ajax_call?query=Траливали这样的URL没有被转换。
IE8等其他浏览器根本不转换查询。
问题是:如何检测(在 PHP 中)查询是否已编码?怎么解码?
我试过了:
-
$str = iconv('cp1251', 'utf-8', urldecode($str) );
-
$str = utf8_decode(urldecode($str));
-
$str = (urldecode($str));
-
来自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 进行解析。
【问题讨论】:
-
请注意这里有两个步骤:从浏览器到您的脚本,以及从脚本到您的浏览器。如果您想看到您想要的数据,这两个步骤都需要正确完成。所以这取决于你的脚本需要做什么。请参阅我的更新答案以获取一些建议。
-
关于更新:您是否以相同的编码保存文件? (我假设连接是 utf-8?)尝试测试
d('%...' == rawurlencode($str)) -
我添加了一些测试,rawurlencode 给出的结果与 urlencode 相同。
-
刚刚尝试从您的“Траливали”字符串中复制/粘贴,在这里工作就像一个魅力,比较
$str == 'Траливали'。您确定您正在以正确的编码保存 php 脚本吗?如果在脚本中输入echo 'Траливали';会发生什么?它是否正确显示在屏幕上? -
你需要慢慢来,一步一步地评估。查看您的示例网址:您确定“Траливали”在 utf-8 中是“%D2%F0%E0%EB%E8%E2%E0%EB%E8”吗?这里显示为“%D0%A2%D1%80%D0%B0%D0%BB%D0%B8%D0%B2%D0%B0%D0%BB%D0%B8”。会不会是这个问题?
标签: php url utf-8 utf8-decode