Php url编码在Firefox和Internet Explorer中的行为不同

Php url编码在Firefox和Internet Explorer中的行为不同,php,encoding,special-characters,urlencode,Php,Encoding,Special Characters,Urlencode,我想把用户输入发送到谷歌的地理编码API。在这样做的过程中,我发现了一个问题。 当我通过脚本将用户输入(例如“köln+Germany”)发送到Firefox中的api时,效果非常好。但在Internet Explorer中,它不工作 以下是我的代码豁免,足以说明问题: header('Content-type: text/html; charset=UTF-8'); header('Cache-Control: no-cache, must-revalidate'); $loc = urlen

我想把用户输入发送到谷歌的地理编码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)是:(工作!)

Internet Explorer中的相同内容是:(返回“无效的请求”)

您可以看到ö的编码不同。在Firefox中是%C3%B6,在IE中是k%F6。 如果我让用户输入“k%C3%B6ln+Germany”作为开始,它在InternetExplorer中的效果也很好

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

多谢各位


Paul

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

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

在HTML-
中,这将把编码设置为UTF-8,因此IE将像Firefox一样对字符串进行URL编码,从而生成一个工作请求

顺便说一句,如果您希望html页面成为链接,那么您应该提供一个html页面

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

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

这样IE将在显示链接时使用给定的UTF-8编码

如果没有这些东西,它可能会工作,但是IE会解码给定的
,猜测它是一个链接,然后在它周围制作自己的html头体来显示它-然后包含一个


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

因此,我知道这不是正确的解决方案,但对于遇到相同问题的任何人来说,此解决方法对我很有效:

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

因为我不需要在我的上下文中保留Umlauts,所以这没关系。

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


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

谢谢您的回答!我以前可能应该这么说,但实际上我不打算输出html页面。它最终会生成json,所以我对添加meta标记有点犹豫。。你觉得怎么样?更新:这在输出HTML时似乎也不起作用。还有其他想法吗?