当我输入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中)查询是否被编码?如何解码?
我试过了:
$ 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] [假] [假] ???? [TRUE]
某种解决方案:http://www.example.com/Траливали/ - 将查询作为网址部分发送,并使用mod_rewrite进行解析。
答案 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()
。
答案 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)
$-_.+!*'(),"
和保留字符;/?:@=&
在URL中未编码。其他所有内容都由HTTP客户端编码,即Web浏览器。无论PHP是否自动解码查询字符串,您都可以使用rawurldecode()。双解码没有危险。