PHP UTF编码的URL字符串

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中)查询是否被编码?怎么解码呢?

我试过了:

  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)); !

返回:

[false] [false] [false] ???? [真正]

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

And*_*ore 6

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编码时才会出现这种情况.您的文本编辑器应该能够告诉您文件的编码.

  • @topright`#ajax_call?query =Траливали`表示该片段由文本`ajax_call?query =Траливали`组成.片段**不会发送到服务器**.换句话说,**在URL中的#`之后放置的任何内容都不会发送到服务器**. (2认同)
  • 不相信我?尝试一下......`echo $ _SERVER ['REQUEST_URI'];`将准确地给出Apache看到的请求.您很快就会注意到片段丢失了.还要检查你的日志...没有片段. (2认同)

mvd*_*vds 4

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)

看看是否有帮助。