当我尝试使用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模块做的一切,但是,仍然无法理解配置在哪里
答案 0 :(得分:3)
答案是您无法确切知道,因为它可能会从请求更改为请求,特别是如果它不是始终从表单提交,而是有时使用ajax发送,或者由用户直接在地址栏中输入。
我使用波兰语的应用程序。该应用程序与ISO-8859-2代码页一起使用,并且所有html输出都以此编码方式提供。
应用程序以两种不同的编码方式接收请求,具体取决于请求的上下文:
所以,真的没办法确定。如果可以,请始终使用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
(非英文版)
我解决它如下:
在PHP页面文件的顶部添加header('Content-type: text/html; charset=utf-8');
。
重要在adobe dreameweaver
,您应该从Page Properties
top menu
修改Modify (M) -> Page Properties (P)
,选择Title/coding
并修改<{1}} unicode
{/ 1}}。{/ p>
(对不起,这些菜单单词被翻译成英文,可能不是真正的单词)