PHP UTF编码的URL字符串

时间:2010-07-30 02:57:27

标签: php url utf-8 utf8-decode

当我输入Firefox(在地址栏中)网址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的许多功能 没什么用。

  5. 测试:

      

    $ 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] [假] [假] ???? [TRUE]

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

7 个答案:

答案 0 :(得分:6)

在片段无效后,它不会转换为具有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编码时才会出现这种情况。您的文本编辑器应该能够告诉您文件的编码。

答案 1 :(得分:2)

rawurldecode($_GET['query']);

但实际上这应该已经由php完成了; - )

编辑你说“没有用” - 你在尝试什么?如果文本没有按照您的需要显示在屏幕上,例如,当您echo $_GET['query'];时,问题可能是您为发送回浏览器的页面指定的编码。

加入一行

header("Content-Type: text/html; charset=utf-8");

看看它是否有帮助。

答案 2 :(得分:2)

遗憾的是,片段是如何编码的,browser-dependent

  

是否通过应用RFC强制URL转义规则对片段ID(哈希)进行编码?   MSIE:没有   Firefox:PARTLY
  Safari:是
  歌剧:没有   Chrome:没有   Android:是

关于浏览器在将国际(读取:非ASCII)字符转换为%nn转义序列之前使用什么编码进行编码的问题,“大多数浏览器通过默认发送UTF-8数据来处理此问题手动在URL栏中输入的任何文本,并在所有后续链接上使用页面编码。“ (同一source)。

答案 3 :(得分:1)

您可以使用UTF8::autoconvert_request()

请查看http://code.google.com/p/php5-utf8/了解详情。

答案 4 :(得分:0)

网址仅限于某些ascii字符。非url友好字符应该是url编码的(你看到的%hh编码)。某些浏览器可能会自动编码添加行上显示的网址。

答案 5 :(得分:0)

答案很简单:正在编码的字符串始终。正如HTTP标准中所述 什么是firefox 显示 - 没关系。

此外,由于PHP自动解码查询字符串,因此无需解码。

请注意'%D2%F0%E0%EB%E8%E2%E0%EB%E8'是单字节编码,因此,您的页面可能在1251.至少HTTP标头说明了这一点。
而AJAX总是使用utf-8。

因此,你只需要为你的页面使用单一编码(utf-8),或者将ajax调用与常规调用区分开来。

对于片段 - 不要使用片段值将其发送到服务器。有一个JS变量,然后使用它两次 - 设置片段并使用JSON发送到服务器。

答案 6 :(得分:0)

RFC 1738规定只有字母数字,特殊字符$-_.+!*'(),"和保留字符;/?:@=&在URL中未编码。其他所有内容都由HTTP客户端编码,即Web浏览器。无论PHP是否自动解码查询字符串,您都可以使用rawurldecode()。双解码没有危险。

相关问题