url编码在Firefox和Internet Explorer中表现不同

时间:2011-11-30 08:29:08

标签: php encoding special-characters urlencode

我想将用户的条目发送到Google的地理编码API。这样做,我发现了一个问题。 当我通过我的脚本将用户输入(例如“köln+ Germany”)发送到Firefox中的api时,效果很好。但是在Internet Explorer中,它无法正常工作。

这是我的代码的豁免,足以显示问题:

header('Content-type: text/html; charset=UTF-8');
header('Cache-Control: no-cache, must-revalidate');
$loc = urlencode($_GET['loc']);
echo $address = "http://maps.googleapis.com/maps/api/geocode/json?address=$loc&sensor=false";

Firefox中的输出($ address)是:http://maps.googleapis.com/maps/api/geocode/json?address=k%C3%B6ln+Germany&sensor=false(有效!)

Internet Explorer中的相同内容是:http://maps.googleapis.com/maps/api/geocode/json?address=k%F6ln+Germany&sensor=false(返回“INVALID_REQUEST”)

您可以看到ö的编码差异。在Firefox中它是%C3%B6,在IE中它是k%F6。 如果我首先让用户输入“k%C3%B6ln +德国”,它就像在Internet Explorer中的魅力一样。

我如何使用PHP确保我的特殊字符的转换在Internet Explorer中与在Firefox中相同。所以ö=%C3%B6而不是ö= k%F6

非常感谢!

3 个答案:

答案 0 :(得分:3)

这是一个编码问题,Firefox中的默认编码是UTF-8,而在IE中它是一些ISO-XXXX-X,尝试设置

 <meta http-equiv="content-type" content="text/html; charset=UTF-8">

在您的HTML中 - <head>...</head>这会将编码设置为UTF-8,因此IE会像Firefox一样对该字符串进行urlencode,从而产生一个工作请求。

顺便说一下,如果你想要一个链接,你应该提供一个html页面,所以你应该

echo  '<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body>';
在回复<a href=...>

之前

echo '</body></html>';

之后。

这样,IE将使用给定的UTF-8编码来显示链接。

看起来好像没有那些东西就可以工作,然后IE解码给定的<a href=...>,猜测它是一个链接,然后在它周围制作自己的html-head-body来显示它 - 然后包括<meta http-equiv="content-type" content="text/html; charset=ISO-XXXX-X">代替。

如果您只是将通过“AJAX”链接传递给已加载的页面,请确保此页面包含上述元标记。

答案 1 :(得分:0)

所以我知道这不是一个合适的解决方案,但对于遇到同样问题的人来说,这个解决方法对我有用:

$loc = $_GET['loc'];
$loc = utf8_encode($loc); 
$trans = array("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss");
$loc = strtr($loc, $trans);
$loc = urlencode($loc);

由于我不需要在我的上下文中保留元音,这没关系。

答案 2 :(得分:0)

问题只与浏览器间接相关。 urlencode将字符串视为字节序列,因此受服务器页面使用的语言环境的影响。大多数Web服务器检查浏览器的语言设置以检测此设置,并将其用于本地化文本生成和解析。 IE的语言设置默认为操作系统用户的语言环境设置。

这意味着Firefox可能会将英语报告为用户的首选语言,而IE将在同一台计算机上报告德语。除非您首先将输入字符串专门转换为UTF8,否则转换将取决于客户端的语言环境