在Internet Explorer表单提交中设置字符编码
我有一个包含表单的页面。该页面的内容类型为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="☠" />
然后,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 ?>