【问题标题】:How to set the "Content-Type ... charset" in the request header using a HTML link如何使用 HTML 链接在请求标头中设置“Content-Type ... charset”
【发布时间】:2011-09-07 21:48:24
【问题描述】:

我有一个带有 UTF-8 编码链接的简单 HTML 页面。

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <a charset='UTF-8' href='http://server/search?q=%C3%BC'>search for "ü"</a>
  </body>
</html>

但是,我没有让浏览器将Content-Type:application/x-www-form-urlencoded; charset=utf-8 包含在请求标头中。因此,我必须配置 Web 服务器以假设所有请求都是 UTF-8 编码的(Tomcat server.xml 文件中的 URIEncoding="UTF-8")。但是管理员当然不会让我在生产环境中这样做 (WebSphere)。

我知道使用 Ajax 很容易实现,但是在使用标准 HTML 链接时如何控制请求标头? charset 属性似乎对我不起作用(在 Internet Explorer 8 和 Firefox 3.5 中测试)

所需解决方案的第二部分是在使用 JavaScript 更改 IFrame 的 document.location 时设置 URL 编码。

【问题讨论】:

  • charset 属性不是很有用,现在已弃用。请参阅此相关问题:stackoverflow.com/questions/17199047/…
  • 您链接到的问题与这个问题并没有真正的关系。然而,很明显
  • 是的,我不是说这两个问题是重复的。

标签: html character-encoding special-characters urlencode


【解决方案1】:

这在 HTML 上是不可能的。

您可以获得的最接近的是&lt;form&gt;accept-charset 属性。只有 Internet Explorer 坚持这一点,但即便如此,它也做错了(例如,当它说它已发送 ISO-8859-1 时,CP-1252实际上被使用了)。其他浏览器完全忽略它,它们使用响应的Content-Type 标头中指定的字符集。

设置正确的字符编码基本上完全是服务器端的责任。客户端应该以与服务器发送响应相同的字符集将其发送回。

说到点子上,你应该完全从服务器端配置字符编码的东西。为了克服无法编辑 URIEncoding 属性的问题,StackOverflow 上的某个人编写了一个(复杂的)过滤器:Detect the URI encoding automatically in Tomcat。您可能会发现它也很有用(注意:我还没有测试过)。


请注意,当通过 HTTP 传输内容时,您的问题中给出的元标记会被忽略。相反,HTTP 响应 Content-Type 标头将用于确定内容类型和字符编码。您可以在 Net 面板中使用例如 Firebug 来确定 HTTP 标头。

【讨论】:

  • 好的,谢谢。我现在似乎明白了。但是如何在服务器端设置字符集?我的初始页面是一个带有&lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt; 的静态html 文件,但是网络服务器在发送它时在HTTP 标头中没有字符集信息。您是否知道有关 HTTP 和 HTML 标头中的编码信息应该如何协同工作的任何资源?为什么我们两个都需要?
  • 当页面通过 HTTP 提供时,元标记将被忽略(请参阅答案更新)。使用 JSP 时,应将&lt;%@ page pageEncoding="UTF-8" %&gt; 放在最前面。使用 Servlet 时,应该使用response.setCharacterEncoding("UTF-8");。两者都将在内容类型标头中隐式设置正确的字符集。您可能会发现这篇文章很有用:Unicode - How to get characters right?。对于 JSP/Servlet 解决方案,请从 this chapter 开始。
  • 太棒了。每天我都能学到这样的东西,这当然是美好的一天。
  • @BalusC :我发现一个服务器允许它的用户上传任意内容,但总是设置相同的内容类型。X-Content-Type-Options没有设置,但现代浏览器倾向于不再进行 mime 类型嗅探. 那么有没有办法用 ʜᴛᴍʟ 覆盖服务器提供的 mime 类型? (忽略哪些 html 属性被剥离)
猜你喜欢
  • 2012-05-27
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多