无论服务器内容类型标题如何,如何告诉浏览器HTML网站的字符编码?


9

我有一个正确的HTML页面(磁盘上的物理编码与之匹配)宣布它为Content-Type

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

在浏览器(Google Chrome,Firefox)中从磁盘打开文件可以正常工作。

通过HTTP请求,网络服务器发送一个不同的Content-Type标头:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(请参阅最后一行)。然后,浏览器使用ISO-8859-1进行显示,这是不想要的结果。

有没有一种通用的方法可以覆盖从HTML文档中发送到浏览器的服务器标头?

Answers:


6

“是否有一种通用方法可以覆盖从HTML文档中发送到浏览器的服务器标头?”

AFAIK不,您要做的就是已经可以做。通过Header定义的字符集比您在META标记中的定义要重要。

如果您有权访问服务器(例如Apache),则通过以下语句对其进行配置(请参见注释行):

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[更新]

在这里第二点w3d的评论中,您将找到一些通过htaccess-Directives更改Apache服务器的字符集的方法。


2
+1 HTTP标头会覆盖HTML元标记。如果@hakre可以访问服务器端,则它们也可以按页面覆盖Content-Type标头。
怀特先生(MrWhite)2012年

3
正确,这是规范性参考,指定HTTP标头胜过meta标签:w3.org/TR/REC-html40/charset.html#h-5.2.2
Jukka K. Korpela 2012年

感谢您的回答。@Korpela:是的,我在HTML规范中已经记了一下。这正是我需要的:(反过来。
hakre

关于.htaccess(很抱歉,这可能应该是一个新问题),是否也可以;charset=...从http标头中删除。该站点与可以很好地Content-Type: text/html协作,服务器上不同的文件具有不同的编码。(我担心这也是不可能的,因为我认为几周前确实找到了,但是结果还不是很确定)。以防万一,您可以马上了解一下。
hakre 2012年

@hakre如果Apache的ForceType指令对您有用,请将其放在<Files>容器中并分别命名文件或某些目录。只需在mime类型后面留下“; charset =”部分,然后就可以了。
initall,2012年

3

您应该在根.htaccess中设置类似这样的内容

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>

3

不,在HTML中是不可能的。服务器响应标头优先于文档的元标记。如5.2.2中指定的指定字符编码-HTML 4.01规范

综上所述,合格的用户代理在确定文档的字符编码时必须遵循以下优先级(从最高优先级到最低优先级):

  1. “ Content-Type”字段中的HTTP“ charset”参数。
  2. 一个META声明,其中“ http-equiv”设置为“ Content-Type”,而值设置为“ charset”。
  3. 在指定外部资源的元素上设置的charset属性。

因此,这需要在服务器端进行配置。但是,随着本章的继续:

用户代理可以提供一种机制,允许用户覆盖不正确的“字符集”信息。但是,如果用户代理提供了这种机制,则应仅将其提供给浏览,而不提供编辑,以避免创建带有错误的“字符集”参数标记的Web页面。

在我的情况下,服务器的Content-Type标头包含正确的mime-type但错误的charset

事实证明,我的Apache httpd配置已AddDefaultCharset打开,正在添加; charset=ISO-8859-1零件。将以.htaccess下行放入网站根目录中:

AddDefaultCharset Off

字符集信息已删除:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(请参阅最后一行,; charset=...无内容)。结合html meta-tag触发上述浏览器启发式方法从meta标签接管字符集。该网站已正确解码。

经过测试:

  • Google Chrome v.22.0.1229.94
  • Firefox版本16.0.1
  • Lynx版本2.8.7rel.1(2009年7月5日)

这三个浏览器在原始配置方面均存在问题,并且现在可以正常运行(全部在Fedora 17上运行)。

  • 歌剧12.02
  • Internet Explorer 6(Win XP SP3)

首先没有问题。相对于服务器的ISO-8859-1设置,两者都更喜欢meta-tag中的UTF-8

  • Netscape 2.01金

不支持UTF-8,因此无论服务器设置和元标记如何,始终选择Western(Latin1)


1

除了这里所说的以外,我会尝试在所有页面中使用相同的字符集-最好UTF-8(但是,如果几乎所有内容都是iso-8859-1,请使用此字符集)。

要快速检查文件的字符集,您可以尝试:

file --mime-type --mime-encoding {filename}

要检查树中所有文件的字符集,可以尝试:

find . -type f -exec file --mime-type --mime-encoding '{}' \;

或(file仅调用一次命令):

find . -type f -print | file --mime-type --mime-encoding -f-

要获取摘要,请-bfile命令中使用该选项(忽略文件名),然后将结果传递给sort | uniq -c

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.