在Internet Explorer表单提交中设置字符编码

时间:2020-03-06 14:55:42  来源:igfitidea点击:

我有一个包含表单的页面。该页面的内容类型为text / html; charset = utf-8. 我需要使用ISO-8859-1字符编码将此表单提交到服务器。 Internet Explorer可以做到这一点吗?

像这样,将accept-charset属性设置为表单元素,适用于Firefox,Opera等,但不适用于IE。

<form accept-charset="ISO-8859-1">
  ...
</form>

编辑:此表单是由服务器A创建的,将提交给服务器B。我无法控制服务器B。

如果我将服务器A设置为使用字符集ISO-8859-1来提供内容,那么一切正常,但是我正在寻找一种无需更改服务器A编码即可使其正常工作的方法。我还有一个关于在服务器A中设置编码的问题。

解决方案

我敢肯定,较旧版本的IE将无法实现。在设计" accept-charset"属性之前," form"元素无法指定它们接受的字符编码,浏览器可以做的最好的事情就是假设表单所在页面的编码将起作用。

令人遗憾的是,我们需要知道使用了哪种编码-如今,我们希望我们的Web框架能够隐式地处理这些细节,并将文本数据作为已解码的Unicode字符串公开给应用程序。

看起来Microsoft知道accept-charset,但是他们的文档没有告诉它开始使用哪个版本...
我们都不告诉我们在哪个版本的浏览器中对其进行了测试。

我似乎记得,如果accept-charset编码与content-type标头中指定的编码不匹配,Internet Explorer会感到困惑。在示例中,我们声称文档以UTF-8格式发送,但希望表单以ISO-8859-1格式提交。尝试匹配那些,看看是否能解决问题。

如果我们完全有权访问服务器,请将其处理转换为UTF-8. 提交非UTF-8表单的技巧是一个漫长而令人遗憾的故事。这份有关表格和i18n的文档可能会引起兴趣。我了解我们似乎并不关心国际支持;我们始终可以将UTF-8数据转换为html实体,以确保其保持Latin-1格式。

似乎无法做到这一点,至少不能在当前版本的IE(6和7)上实现。

IE支持表单属性accept-charset,但前提是其值为'utf-8'。

解决方案是修改服务器A,以为包含表单的页面生成编码" ISO-8859-1"。

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

有一个简单的技巧:

在表单中插入一个带有实体的隐藏输入字段,该实体仅出现在我们发布(或者执行GET)的服务器接受的字符集中。

示例:如果该表单位于提供ISO-8859-1的服务器上,并且该表单将发布到服务器,并期望UTF-8在表单中插入以下内容:

<input name="iehack" type="hidden" value="&#9760;" />

然后,IE将"检测"表单包含UTF-8字符,并在我们进行POST或者GET时使用UTF-8. 奇怪,但确实有效。

只是遇到了同样的问题,我有一个相对简单的解决方案,它不需要页面字符编码中的任何更改(这很麻烦)。

例如,站点位于utf-8中,而我们想要将表单发布到iso-8859-1中的站点。只需将帖子的操作更改为我们网站上的页面即可将发布的值从utf-8转换为iso-8859-1.

这可以在php中轻松完成,如下所示:

<?php
$params = array();
foreach($_POST as $key=>$value) {
    $params[] = $key."=".rawurlencode(utf8_decode($value));
}
$params = implode("&",$params);

//then you redirect to the final page in iso-8859-1
?>