代码之家  ›  专栏  ›  技术社区  ›  Eduard Wirch

如何强制浏览器在内容类型http头中设置字符集

  •  12
  • Eduard Wirch  · 技术社区  · 16 年前

    一个简单的HTML文件:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
    <form method="POST" action="test.jsp" accept-charset="utf-8" method="post" enctype="application/x-www-form-urlencoded" >
        <input type="text" name="P"/>
        <input type="submit" value="subMit"/>
    </form>
    </body>
    </html>
    

    服务器使用头为html文件提供服务 Content-Type:text/html; charset=utf-8 . 一切都在说:“亲爱的浏览器,当你发布这张表格时,请将它用utf-8编码”。浏览器实际上做到了这一点。输入字段中输入的每个值都将被utf-8编码。 但是 浏览器不会告诉服务器这个!post请求的http头将包含 Content-Type:application/x-www-form-urlencoded 字段,但字符集将被忽略(使用ff3.6和ie8进行测试)。

    问题是我使用的应用服务器(tomcat6)需要内容类型头中的字符集(如rfc238中所述)。这样地: Content-Type:application/x-www-form-urlencoded;charset=utf-8 . 如果省略字符集,它将假定iso-8859-1不是用于编码的字符集。结果是数据被破坏了。

    有人知道如何强制当前浏览器将字符集追加到内容类型头吗?

    1 回复  |  直到 15 年前
        1
  •  11
  •   bobince    16 年前

    有人知道如何强制当前浏览器将字符集追加到内容类型头吗?

    不,没有浏览器提供 charset 参数与 application/x-www-form-urlencoded 媒体类型。此外,定义该类型的html规范不建议 字符集 参数,因此服务器不能合理地期望得到一个。

    (HTML4) 做 期待一个 字符集 对于 multipart/form-data 提交,但即使在这种情况下,也没有浏览器真正符合要求。)

    接受charset=“utf-8”

    accept-charset 在IE中已损坏,不应使用。对于作为utf-8服务的页面中的表单来说,这两种方式都没有区别,但在其他情况下,最终可能会得到不一致的结果。

    不,对于表单,您只需将它们作为utf-8提供给页面,结果应该返回到utf-8(没有识别标记来告诉您这一点(除了潜在的 _charset_ hack ,但tomcat不支持这一点)。

    因此,如果不想让servlet容器回到默认值(通常是错误的),就必须告诉它参数使用什么编码。在有限的情况下,你可以打电话给 ServletRequest.setCharacterEncoding() 要做到这一点,但这往往很脆弱,对于从查询字符串中获取的参数根本不起作用。遗憾的是,还没有一个标准化的servlet级别的解决方案。对于Tomcat你通常必须 muck about with the server.xml 而不是在应用程序中修复它。

    推荐文章