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

Posted

技术标签:

【中文标题】url 编码在 Firefox 和 Internet Explorer 中的行为不同【英文标题】:url encode behaving differently in Firefox and Internet Explorer 【发布时间】:2011-11-30 08:29:08 【问题描述】:

我想将用户的条目发送到 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+Germany”开始,它在 Internet Explorer 中也像一个魅力。

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

非常感谢!

保罗

【问题讨论】:

【参考方案1】:

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

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

在您的 HTML -&lt;head&gt;...&lt;/head&gt; 中,这会将编码设置为 UTF-8,因此 IE 将像 Firefox 一样对字符串进行 urlencode,从而产生一个有效的请求。

顺便说一句,如果你希望它是一个链接,你应该提供一个 html 页面,所以你应该

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

在回显&lt;a href=...&gt;

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

之后。

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

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

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

【讨论】:

感谢您的回答!我之前可能应该说过这个,但实际上我不会输出 html 页面。到底是要生成json,所以有点犹豫要不要加meta标签。。你觉得呢? 更新:这在仅输出 HTML 时似乎也不起作用。还有其他想法吗?【参考方案2】:

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

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

因为我不需要在我的上下文中保留变音符号,所以没关系。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于url 编码在 Firefox 和 Internet Explorer 中的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有

FireFox 和 Chrome 在 url 中处理 \(反斜杠)的不同行为

url组成部分详解

如何让firefox和chrome支持css自定义鼠标样式?IE中用“cursor:url()”属性可以实现,FF、Chrome怎么弄?

Firefox尝试支持AV1视频压缩编码:文件体积优于HEVC和VP9

为啥 http:///example.org(带有三斜杠)被 Firefox 和 webkit 视为有效 URL?