<meta charset =“ utf-8”>与<meta http-equiv =“ Content-Type”>


1535

为了为HTML5 Doctype定义字符集,我应该使用哪种表示法?

  1. 短:

    <meta charset="utf-8" /> 
  2. 长:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

94
将<meta>标记用于诸如内容类型和编码之类的做法具有讽刺意味,因为如果不了解这些内容,就无法解析文件来获取meta标记的值。
马克

321
您可以将其解析为ASCII,直到达到为止。HTML5解析算法将这一点考虑在内。
昆汀

41
应注意的是,当通过Web提供页面时,两者都不用于解析。而是Content-Type使用HTTP 响应标头中的那个。仅当从本地磁盘文件系统加载页面时才使用meta标记。
BalusC

38
在某些情况下(包括HTTP头中没有数据)在HTTP上使用meta元素
Quentin

78
具有讽刺意味的是,当它确实用于指定编码时,将其命名为charset。(字符集为Unicode,编码为UTF-8)
Ryan

Answers:


1084

在HTML5中,它们是等效的。使用较短的那一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。


23
浏览器支持如何?是否<meta charset='utf-8'>在IE6的工作?
森那维达斯

11
据我所知,是的。
昆汀

4
这是@ŠimeVidas提到的Google代码页的更新链接。它说,关于IE 6、7和8,“在非IE浏览器中,您可以使用document.characterSet。在IE中,您可能认为您可以使用document.getElementsByTagName('meta')[0] .charset,但这仅返回您指定的字符编码,而不返回IE实际使用的编码。”
hotshot309 2012年

7
我知道这个线程很旧,但是gtmetrix.com/specify-a-character-set-early.html指示使用<meta>设置字符编码会禁用IE8中的先行下载程序,这可能会影响您的页面加载时间。是的,我知道...删除IE8。@MészárosLajos可以在几年后回到这里,破坏我们的球,因为它仍然支持IE8。;-)
erturne 2014年

3
今天我遇到一个问题,即IE11中没有出现韩文符号。放弃较短的语法而改为较长的语法可以解决此问题。我不知道这是否是由于某种服务器配置引起的,还是IE11和字符集存在问题。失败的确切符号组合是베라。
James Donnelly 2015年

250

两种形式的meta charset声明都是等效的,并且在浏览器之间应相同。但是,在将Web文件的字符集声明为UTF-8时,需要记住一些事项:

  1. 保存文件(S)以UTF-8编码,而不字节顺序标记(BOM)。
  2. 使用元字符集声明HTML文件中的编码(如上)。
  3. 您的Web服务器必须提供文件,并在Content-Type HTTP标头中声明UTF-8编码。

默认情况下,Apache服务器配置为提供ISO-8859-1中的文件,因此您需要在.htaccess文件中添加以下行:

AddDefaultCharset UTF-8

这将配置Apache来为您的文件提供服务,以在Content-Type响应标头中声明UTF-8编码,但是首先必须将文件保存在UTF-8(无BOM)中。

如果没有BOM表,记事本无法将文件保存为UTF-8。一个可以是Notepad ++的免费编辑器。在程序菜单栏上,选择“编码>在没有BOM的UTF-8中编码”。您也可以使用“编码>转换为不带BOM的UTF-8”打开文件并将其重新保存为UTF-8。

有关Wikipedia字节顺序标记(BOM)的更多信息。


20
@CodeBoy我会修改您的回答,说“您应该保存...而不使用BOM”。下一页显示“ ...通常最好省略互操作性BOM ...”指示最佳实践,但不是必需
Johann

3
在IIS中,您可以使用Web.Config中的<globalization fileEncoding =“ utf-8” responseEncoding =“ utf-8” />在HTTP标头中设置字符集-将其添加到<system.web>
Chris Moschini 2013年

3
据我了解,如果您保存没有BOM的产品,这一点都没有关系。
David天宇Wong 2013年

3
为什么说UTF-8 HTML应该没有BOM。拥有物料清单应该可以正常工作。另外,您不需要metaHTTP标头。您只需要BOM meta或HTTP标头之一。
hsivonen

5
Summing up: don't use BOM for UTF-8我不同意这一点。UTF-8中的BOM对发信号通知编码类型非常有用。否则,我们不得不猜测,或者使用类似此问题所指的meta标签之类的东西。BOM的优点是它是Unicode规范的一部分,因此可以用于所有以Unicode编码的数据,而不仅仅是HTML。我们应该做的是在所有地方使用BOM,让旧软件崩溃,报告这些错误并修复它们。
Stijn de Witt

82

简短的另一个原因是,它与您可以在标记中指定字符集的其他实例匹配。例如:

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

一致性有助于减少错误并使代码更具可读性。

请注意,charset属性不区分大小写。您可以使用UTF-8或utf-8,但是UTF-8更清晰,可读性更高,更准确。

另外,绝对没有理由在meta charset属性或页面标题中使用除UTF-8以外的任何值。自1999年HTML4以来,UTF-8是Web文档的默认编码,并且是制作现代Web页面的唯一实用方法。

另外,您不应该在UTF-8中使用HTML实体。诸如版权符号之类的字符应直接输入。您应该使用的唯一实体是5个保留的标记字符:小于,大于,&符,质数,双质数。实体需要一个HTML解析器,您可能并不一定会一直使用它,它们会引入错误,使代码的可读性降低,文件大小增加,有时会根据您使用的实体在各种浏览器中解码不正确。了解如何在内容中键入/插入版权,商标,引号,右引号,撇号,破折号,破折号,项目符号,欧元以及您在内容中遇到的任何其他字符,以及如何在代码中使用这些实际字符。Mac有一个“角色查看器”,您可以在“键盘系统偏好设置”中将其打开,您可以找到并拖放所需的字符,或者使用匹配的Keyboard Viewer查看要键入的键。例如,商标为Option + 2。UTF-8包含来自每种书面人类语言的所有字符和符号。因此,没有理由使用-而不是破折号。学习标点符号和排版的规则也不错……例如,知道句点在引号内,而不是在引号内。

对内容类型和编码之类的东西使用标签非常具有讽刺意味,因为如果不了解这些内容,就无法解析文件来获取meta标签的值。

不,那不是真的。浏览器开始将文件解析为浏览器的默认编码,即UTF-8或ISO-8859-1。由于US-ASCII是ISO-8859-1 UTF-8 的子集,因此浏览器可以任意一种方式进行读取...相同。当浏览器遇到meta charset标记时,如果编码与浏览器已经使用的编码不同,则浏览器将以指定的编码重新加载页面。这就是为什么我们将meta charset标记放在顶部,紧随head标记之后,再加上其他任何内容,甚至标题。这样,您可以在标题中使用UTF-8字符。

您必须以没有BOM的UTF-8编码保存文件

严格说来并非如此。如果文档中仅包含US-ASCII字符,则可以将其另存为US-ASCII并用作UTF-8,因为它是一个子集。但是,如果有Unicode字符,那是正确的,您必须另存为UTF-8(不带BOM)。

如果您想要一个好的文本编辑器来将文件保存为UTF-8,我建议使用Notepad ++。

在Mac上,可以使用Mac App Store上的Bare Bones TextWrangler(免费),也可以在Mac App Store中使用Bare Bones BBEdit,价格为39.99美元……对于如此出色的工具而言,价格非常便宜。在任一应用程序中,文档窗口底部都有一个菜单,您可以在其中指定文档编码,并且可以轻松选择“ UTF-8 no BOM”。当然,您可以在“首选项”中将其设置为新文档的默认值。

但是,如果建议您的Web服务器在HTTP标头中提供编码,则不需要两个[meta标签]。

那是不对的。当然,您应该在HTTP标头中设置编码,但也应该在meta charset属性中设置它,以便用户可以将页面从浏览器中保存到本地存储,然后在以后再次打开。唯一出现的编码指示是meta charset属性。您还应出于相同的原因设置基本标签...在服务器上,基本标签是不必要的,但是当从本地存储中打开时,基本标签使页面就像在服务器上一样工作,所有资产到位等等,没有断开的链接。

添加默认字符集UTF-8

或者,您可以只更改特定文件类型的编码,如下所示:

AddType text/html;charset=utf-8 html

同时提供UTF-8和Latin-1(ISO-8859-1)文件的技巧是为UTF-8文件提供“文本”扩展名,为Latin-1文件提供“ txt”。

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

最后,考虑使用Unix行尾而不是传统DOS或(经典)Mac行尾来保存文档,这无济于事并且可能会造成伤害,尤其是随着我们与那些旧系统的距离越来越远,这种情况尤其严重。具有有效HTML5,UTF-8编码和Unix行尾的HTML文档是一项出色的工作。您可以在许多情况下共享,编辑,存储,读取和恢复以及依赖该文档。是通用语言。是数字纸。


20
“如果文档中仅包含ISO-8859-1字符,则可以将其另存为ISO-8859-1并用作UTF-8,因为它是一个子集”-错误。如果将“ ISO-8859-1”更改为“ US-ASCII”,那将是正确的。US-ASCII与UTF-8兼容,因为它是子集,而ISO-8859-1不兼容。要将ISO-8859-1(包含非ASCII字符)转换为UTF-8,您需要对非ASCII字符进行编码。ISO-8859-1的代码点确实以Unicode存在,但是UTF-8对US-ASCII之外的代码点的编码方式与ISO-8859-1不同。
thomasrutter

2
您对HTML实体的观点很好。过去,我仅使用实体来发现将它们保存在不同的系统上和/或在不同的编辑器中打开后已转换为UTF-8字符。但是,值得注意的是,不间断空格(&nbsp;)可能会产生令人困惑的结果,因为您通常不会在编辑器中看到它们,因此出于清晰起见,通常最好保留为实体(以我的经验)。
squidbe

"You should also set a base tag..."应该附带这里描述的注意事项。
马富巴

您可能更喜欢HTML实体的另一个原因是,如果您使用的是ionicons之类的东西。我宁愿查看&#xf101;默认字形,也不愿看到一些我不认识的奇怪字符。
Daniel Lubarov

30

<meta charset="utf-8"> 是随HTML5一起引入的。

如文档中所述,两者均有效。但是,<meta charset="utf-8">仅适用于HTML5(更易于键入/记住)。

在适当的时候,旧样式肯定会在不久的将来被淘汰。我会坚持新的<meta charset="utf-8">

只有一种方法,但是向上。以技术为例,那是淘汰旧的(真的,真的很快)

文档: HTML元字符集属性-W3Schools



18

在不反对其他答案的同时,我认为以下值得一提。

  1. “ long”(http-equiv)符号和“ short ”(短)符号相等,以先到者为准;
  2. Web服务器头将覆盖所有<meta>标签;
  3. BOM(字节顺序标记)将覆盖所有内容,并且在许多情况下,它将影响html 4(可能还会影响其他内容);
  4. 如果不声明任何编码,则可能会使用浏览器定义的“后备文本编码”来获取文本。在Firefox和Chrome中都不是utf-8;
  5. 在没有其他线索的情况下,浏览器将尝试像读取ASCII文件一样读取文档,以获取编码,因此您不能使用任何奇怪的编码(不过,使用BOM的utf-16应该可以);
  6. 虽然规范说编码声明必须在文档的前512个字节之内,但大多数浏览器会尝试读取更多内容。

您可以通过运行echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500并将浏览器指向进行测试localhost:4500。(当然,您将需要更改或删除部件。BOM部件为\xef\xbb\xbf。警惕外壳的编码。)

请注意,显式声明编码非常重要。让浏览器猜测可能导致安全问题。


1
不错,但是您能详细说明一下您所指的安全性问题吗?
Armfoot '16

1
长表示法不应覆盖短表示法,因为文档中的第一个应该会获胜。
gsnedders

1
@Armfoot过去,UTF-7从我记忆中可以发现存在问题。而且,在网络上进行嗅探通常是不好的,例如,当您上传图像时,某些东西会被嗅探为脚本内容。
phk

@gsnedders在chrome和Firefox中测试过,您是对的。相应地编辑了答案。Armfoot:这是有关7位编码的事情,不记得是什么。
松鼠

1
@CraigMcQueen可以肯定,浏览器回退仍然(在2018年)默认为西欧的西欧,因此我想它默认为在每个区域占主导地位的任何pre-unicode编码。用户可以将后备时间设置为utf-8,但这只是暴露了所有糟糕的编码,成千上万的站点仍被用作故障高字节ascii字符,因此仍然不常见。更可惜。没有浏览器供应商的一点强制,就看不到这种情况将如何改变,而且他们也不愿意破坏旧有的东西。
brennanyoung

13

使用<meta charset="utf-8" />HTML5时用于Web浏览器。

使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />使用HTML4和XHTML时,或过时的DOM解析器,像DOMDocument在PHP 5.3



1

要将签名嵌入到电子邮件中,我将使用长版本:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

原因是使用html5的电子邮件阅读器并不多,因此始终最好使用旧的html样式。实际上,使用表也比使用divs + css更好。

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.