top*_*dev 4 php url utf-8 utf8-decode
当我输入Firefox(在地址行中)URL(如http://www.example.com/?query=Траливали)时,它会自动编码为http://www.example.com/?query=%D2%F0 %E0%EB%E8%E2%E0%EB%E8.
但是,不转换http://www.example.com/#ajax_call?query=Траливали等网址.
其他浏览器(如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)); !
返回:
[false] [false] [false] ???? [真正]
某种解决方案:http://www.example.com/Траливали/ - 将查询作为url部分发送,并使用mod_rewrite进行解析.
query在片段无效后,它不会转换为具有URL 的一部分.
RFC 3986将URI定义为由以下部分组成:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
Run Code Online (Sandbox Code Playgroud)
订单无法更改.因此,
URL1: http://www.example.com/?query=?????????#ajax_call
Run Code Online (Sandbox Code Playgroud)
将在适当的时候处理
URL2: http://www.example.com/#ajax_call?query=?????????
Run Code Online (Sandbox Code Playgroud)
将不会.如果我们看一下URL2,IE实际上通过检测片段而#ajax_call?query=?????????没有查询来正确处理URL .片段始终是最后一个,永远不会发送到服务器.
IE将正确编码查询组件,URL1因为它将检测它作为查询.
至于PHP中的解码,%D2类似的是在$_GET['query']变量中自动解码.$_GET变量未正确填充的原因是因为in URL2,根据标准没有查询.
此外,最后一件事......在做的时候'?????????' == $_GET['query'],只有当您的PHP脚本本身以UTF-8编码时才会出现这种情况.您的文本编辑器应该能够告诉您文件的编码.
rawurldecode($_GET['query']);
Run Code Online (Sandbox Code Playgroud)
但这实际上应该已经由 php 完成了;-)
编辑你说“没有任何作用” - 你在尝试什么?如果文本没有按照您想要的方式显示在屏幕上,例如echo $_GET['query'];,您的问题可能是您为发送回浏览器的页面指定的编码。
包括一行
header("Content-Type: text/html; charset=utf-8");
Run Code Online (Sandbox Code Playgroud)
看看是否有帮助。
| 归档时间: |
|
| 查看次数: |
4104 次 |
| 最近记录: |