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


url encode behaving differently in Firefox and Internet Explorer

我想将用户的条目发送到google的地理代码API。在这样做时,我发现了一个问题。当我发送用户输入(例如:"köln+德国")通过我的脚本到Firefox中的api,它工作得很好。但是在ie浏览器中它不能工作。

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

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 (works!)

在ie浏览器中相同的是: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+Germany",它在Internet Explorer中也会像魅力一样工作。

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

非常感谢!

保罗

这是一个编码问题,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"传递链接到一个已经加载的页面,确保这个页面包含提到的元标签

所以我知道这不能是正确的解决方案,但对于任何人遇到同样的问题,这种解决方法对我有效:

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

因为我不需要在我的上下文中保留Umlauts,所以这是ok的

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

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