php urldecode utf8编码问题

时间:2011-03-12 11:22:34

标签: php encoding url-encoding

当我尝试使用urlencoded值_GET url(一些cyrilic字):

http://example.com/?action=search&q=%E0%E2%F2%EE%EC%EE%E1%E8%EB%FC

解码后

echo urldecode($_GET['q']); // it prints: ���������

所以,我需要转换为utf-8(因为整个我的应用程序使用utf-8)通过:

mb_convert_encoding($_GET['q'], "UTF-8", "windows-1251");

它有帮助,但问题

谁/什么说它应该确实“windows-1251”?来自哪里? 如果我将使用其他一些语言,我如何定义适当的编码? 魔术在哪里?

(更新):页面编码为utf-8 (更新):实际上,urldecode($ _ GET ['q'])甚至不需要,看起来像apache + php模块做的一切,但是,仍然无法理解配置在哪里

6 个答案:

答案 0 :(得分:3)

答案是您无法确切知道,因为它可能会从请求更改为请求,特别是如果它不是始终从表单提交,而是有时使用ajax发送,或者由用户直接在地址栏中输入。

我使用波兰语的应用程序。该应用程序与ISO-8859-2代码页一起使用,并且所有html输出都以此编码方式提供。

应用程序以两种不同的编码方式接收请求,具体取决于请求的上下文:

  1. 如果请求是表单提交的结果,则编码与提交表单的html页面相同。我认为可以使用form元素的accept-charset属性进行更改,但我还没有尝试过。
  2. 如果使用Ajax发出请求,则它始终为UTF-8(至少在Chrome和Firefox中,因为我们的客户端仅使用这些浏览器)。
  3. 如果请求是手动输入到URL中,那么它通常是UTF-8,但如果它是书签或类似的东西,那么它可能是其他编码(取决于书签的创建方式)。
  4. 所以,真的没办法确定。如果可以,请始终使用UTF-8。否则使用字符集检测(检查它是否是UTF-8,如果不是基于应用程序使用的语言而回退到最可能的编码)。

    我使用以下代码:

    <?php
    $t = 'zażółć gęślą jaźń';
    echo mb_detect_encoding($t, 'UTF-8,ISO-8859-2');
    

    祝你好运, SWilk

答案 1 :(得分:1)

它不是apache也不是mod_php问题。 PHP会自动解码urlencoding,但它不会编码任何东西,所以,没有什么可担心的

从这个

开始
  

在Firefox3中输入example.com/?action=search&q=автомобиль时,它会自动转换为:example.com/?action=search&q=%E0%E2%F2%EE%EC%EE%E1% E8%EB%FC

更像是浏览器或操作系统问题。

您的操作系统编码似乎是单字节,浏览器会对您的单字节字符串进行urlencode。

答案 2 :(得分:0)

你应该保留UTF8并使用适当的内容类型标题将页面的字符集设置为UTF8:

header('Content-type: text/html; charset=utf-8');

答案 3 :(得分:0)

当您直接在URL搜索栏中键入非ASCII字符时,浏览器似乎会自动将字符转换为UTF-8和URL编码实体。我没有关于此的硬数据,但行为是有道理的。相关问题:Unicode characters in URLs

您的页面使用windows-1252或其他一些单字节字符集作为其输出编码,这就是您需要首先转换字符数据的原因。

您可以将页面的输出编码更改为UTF-8以保存该步骤,但这可能会产生其他后果(例如需要使用多字节字符串函数和/或数据库输出的不同编码等)

答案 4 :(得分:0)

windows-1251是一个8位字符编码,旨在涵盖使用西里尔字母的语言。 Wiki

您可能已在网页中将charset设置为windows-1251

答案 5 :(得分:0)

我也遇到了这个问题。我使用adobe dreameweaver cs4(非英文版)

我解决它如下:

  1. 在PHP页面文件的顶部添加header('Content-type: text/html; charset=utf-8');

  2. 重要adobe dreameweaver,您应该从Page Properties top menu修改Modify (M) -> Page Properties (P),选择Title/coding并修改<{1}} unicode {/ 1}}。{/ p>

  3. (对不起,这些菜单单词被翻译成英文,可能不是真正的单词)