vs


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

  1. 短:

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

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

1387
2018-01-14 22:06


起源


对于像内容类型和编码这样的东西使用<meta>标签是非常具有讽刺意味的,因为在不知道这些事情的情况下,您无法解析文件以获取元标记的值。 - Mark
您可以将其解析为ASCII,直到达到它为止。 HTML5解析算法将此考虑在内。 - Quentin
值得注意的是,当通过Web提供页面时,它们都不会被用于解析。而是HTTP中的那个 Content-Type 将使用响应标头。元标记仅在从本地磁盘文件系统加载页面时使用。 - BalusC
元数据在某些条件下通过HTTP使用(包括HTTP标头中缺少数据) - Quentin
具有讽刺意味的是,当它真正用于指定编码时,它被命名为charset。 (字符集是Unicode,编码是UTF-8) - Ryan


答案:


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


978
2018-01-14 22:09



浏览器支持怎么样?是否 <meta charset='utf-8'> 在IE6工作? - Šime Vidas
据我所知,是的。 - Quentin
这是一个更新的链接 Google代码页 @ŠimeVidas提到。它说,关于IE 6,7和8,“在非IE浏览器中,你可以使用document.characterSet。在IE中,你可能认为你可以document.getElementsByTagName('meta')[0] .charset,但是这个只返回你指定的字符编码,而不是IE实际使用的编码。“ - hotshot309
我知道这个帖子很旧,但是 gtmetrix.com/specify-a-character-set-early.html 表示使用 <meta> 设置字符编码会禁用IE8中的前瞻下载程序,这会影响页面加载时间。是的,是的,我知道......放弃IE8。 @MészárosLajos可以在几年内回到这里,为了仍然支持IE8而破灭我们的球。 ;-) - erturne
今天我遇到了IE11中没有出现韩文符号的问题。删除短语法以支持更长的语法可以解决问题。我不知道这是否是由于某种服务器配置,或者它是IE11和charset的问题。失败的确切符号组合是베라。 - James Donnelly


两种形式的 元charset 声明是等效的,并且应该在浏览器中工作相同。但是,在将Web文件字符集声明为UTF-8时,需要记住以下几点:

  1. 以UTF-8编码保存文件  该 字节顺序标记 (BOM)。
  2. 使用在HTML文件中声明编码 元charset (如上所述)。
  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保存文件。一个可以的免费编辑器 记事本+ +。在程序菜单栏上,选择“编码>在没有BOM的UTF-8中编码”。您还可以使用“编码>转换为无BOM的UTF-8”打开文件并以UTF-8重新保存它们。

更多关于 维基百科上的字节订单标记(BOM)


236
2018-05-21 07:26



感谢Apache / .htaccess提示! - Owen
@CodeBoy我会修改你的回答说“你 应该 保存...没有BOM。“下面的页面说”......通常最好的互操作性省略BOM ...“表示最佳做法,但不是要求: w3.org/International/questions/qa-byte-order-mark - Johann
在IIS中,您可以在Web头中使用<globalization fileEncoding =“utf-8”responseEncoding =“utf-8”/>在HTTP标头中设置字符集 - 将其添加到<system.web> - Chris Moschini
据我所知,如果您使用我们没有物料清单保存,那么无所谓。 - David 天宇 Wong
为什么说UTF-8 HTML应该没有BOM。拥有BOM应该可以正常工作。此外,你不需要 meta 和HTTP标头。你只需要一个BOM, meta 或HTTP标头。 - hsivonen


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

<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更清晰,更易读,更准确。

此外,完全没有理由在元字符集属性或页眉中使用除UTF-8之外的任何值。自1999年HTML4以来,UTF-8是Web文档的默认编码,也是制作现代网页的唯一实用方法。

此外,您不应该使用UTF-8中的HTML实体。应直接输入版权符号等字符。您应该使用的唯一实体是5个保留的标记字符:小于,大于,&符号,素数,双素数。实体需要一个HTML解析器,您可能不会总是想要继续使用它们,它们会引入错误,使代码可读性降低,增加文件大小,有时根据您使用的实体在各种浏览器中错误地解码。了解如何输入/插入版权,商标,公开引用,关闭引用,撇号,em破折号,短划线,项目符号,欧元以及您在内容中遇到的任何其他字符,并在代码中使用这些实际字符。 Mac有一个可以在键盘系统首选项中打开的字符查看器,您可以找到并拖放所需的字符,或使用匹配的键盘查看器查看要键入的键。例如,商标是Option + 2。 UTF-8包含来自每种书面人类语言的所有字符和符号。因此没有理由使用 - 而不是使用短划线。学习标点符号和排版规则也不是一个坏主意......例如,知道一段时间是在一个紧密的引用内,而不是在外面。

对内容类型和编码之类的内容使用标记非常重要   具有讽刺意味的是,既然不知道那些东西,就无法解析文件   获取元标记的值。

不,那不是真的。浏览器开始将文件解析为浏览器的默认编码,UTF-8或ISO-8859-1。由于US-ASCII是ISO-8859-1的子集  UTF-8,浏览器可以正常读取......它是一样的。当浏览器遇到元字符集标记时,如果编码与浏览器已使用的编码不同,则浏览器将以指定的编码重新加载页面。这就是为什么我们将元字符集标记放在顶部,紧跟在head标记之后,在其他任何内容之前,甚至是标题。这样你就可以在标题中使用UTF-8字符。

您必须以UTF-8编码保存文件而不使用BOM

这不完全正确。如果文档中只有US-ASCII字符,则可以将其另存为US-ASCII并将其作为UTF-8提供,因为它是一个子集。但是如果有Unicode字符,那么你是正确的,你必须保存为没有BOM的UTF-8。

如果你想要一个好的文本编辑器来保存你的文件   在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属性。你也应该设置一个基本标签,出于同样的原因...在服务器上,基本标签是不必要的,但是当从本地存储打开时,基本标签使页面能够像在服务器上一样工作,所有的资产到位等,没有断开的链接。

AddDefaultCharset 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文档是一项出色的工作。您可以在许多上下文中共享和编辑,存储和读取,恢复和依赖该文档。这是通用语。这是数码纸。


78
2017-08-20 20:26



“如果您的文档中只有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
您对HTML实体的看法很好。在过去,我使用实体只是发现它们被保存在不同的系统上和/或在不同的编辑器中打开后被转换为UTF-8字符。但是,值得注意的是,不间断的空格(&nbsp;)可能会产生令人困惑的结果,因为您通常不会在编辑器中看到它们,所以通常最好保留为实体以保持清晰(根据我的经验)。 - squidbe
我已经编辑了解决上述问题的答案。 - thomasrutter
"You should also set a base tag..." 应该附带描述的警告 这里。 - Mafuba
您可能更喜欢HTML实体的另一个原因是,如果您正在使用类似的东西 ionicons。我宁愿看 &#xf101; 比默认字形,或一些我不认识的奇怪字符。 - Daniel Lubarov


<meta charset="utf-8">与HTML5一起推出。

如文档中所述,两者都是有效的。然而, <meta charset="utf-8"> 仅适用于HTML5(更容易输入/记住)。

在适当的时候,旧样式必然会被弃用 在不远的将来。我坚持新的 <meta charset="utf-8">

只有一种方式,但是上升。在科技的情况下,这是逐步淘汰旧的(真的,真的很快)

文档:  HTML meta charset Attribute-W3Schools


28
2018-06-25 21:04



关于链接,请参阅 meta.stackoverflow.com/questions/280478/why-not-w3schools-com - tripleee


虽然没有对其他答案提出异议,但我认为以下值得一提。

  1. “长”(http-equiv)符号和“短”符号相同,以先到者为准;
  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。 (当然,您需要更改或删除零件。物料清单部分是 \xef\xbb\xbf。警惕shell的编码。)

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


18
2018-01-15 00:03



好点,但你能详细说明你指的是哪些安全问题? - Armfoot
长记法不应该覆盖短记 - 简单地说文档中的第一个应该赢。 - gsnedders
@Armfoot过去曾经存在问题 UTF-7 从我记得的。在网上嗅闻通常也很糟糕,例如当你上传一个被嗅探为脚本内容的图像时。 - phk
@gsnedders在chrome和firefox中测试过,你是对的。相应地编辑了答案。 Armfoot:它是关于7位编码的东西,不记得到底是什么。 - squirrel
“在Firefox和Chrome中都不是utf-8” - 你的意思是什么?如果不是utf-8,那么它是什么? - Craig McQueen


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

使用 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 当使用HTML4或XHTML,或过时的dom解析器,如php中的DOMDocument


9
2017-11-26 08:08





有一些消息基于 Mozilla基金会,和 sitepoint

不要使用此值(http-equiv=content-type)因为它已经过时了。   喜欢 charset 属性<meta>元素。    enter image description here


0
2017-08-15 23:22