为了定义HTML5 doctype的字符集,我应该使用哪种表示法?
Short:
1
| <meta charset="utf-8" /> |
长:
1
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
- 对内容类型和编码之类的内容使用标记是非常讽刺的,因为在不知道这些内容的情况下,无法解析文件以获取meta标记的值。
- 您可以将其解析为ASCII直到到达它。HTML5解析算法考虑到了这一点。
- 需要注意的是,当页面通过Web提供服务时,两者都不用于解析。相反,将使用HTTP Content-Type响应头中的一个。仅当从本地磁盘文件系统加载页面时才使用meta标记。
- 在某些情况下(包括HTTP头中没有数据),在HTTP上使用meta元素。
- 如果您的HTML文件要用于Kindle电子书,则需要使用http-equiv版本。
- 当它真正用于指定编码时,它被命名为charset也是具有讽刺意味的。(字符集为Unicode,编码为UTF-8)
- 虽然HTML5不需要它,但它更像是一个XHTML,考虑关闭元素,即避免在某些编辑器中对非空元素(等)的元素发出大量警告。
- @昆廷:如果出于某种奇怪的原因,你想用UTF-16或UTF-32编码你的页面?我同意马克的观点,使用编码数据来描述它自己的编码是愚蠢的,尽管我们通常可以在这里摆脱它。但是我认为它存在的部分原因是服务器最终会有相同的问题,除非服务器有其他识别/强制编码的方法。
- 使用xhtml 1.0的long声明严格按预期工作。
- 最佳实践是让meta-charset标记成为joelonsoftware.com/articles/unicode.html和code.google.com/p/doctype-mirror/wiki/metacharsetattribute头中的第一个标记。基本上,它需要出现在前512个字节中,越早越好,然后将使用正确的编码解析文档。
- @昆汀完全正确。这就是为什么内容类型元素必须在文档的前100个字节内的原因。
- 从php 5.4.22开始,DOMDocument没有得到长的:(
- 将内容类型:text/html;charset="utf-8"指定为HTTP头并在页面上具有meta标记(即:)是否有任何危害?我不知道我的主机公司是否添加了HTTP头来指定utf-8,我的页面上有meta标签。不知道两者是否都有问题
- 最好的做法是忽略所有这些头、元标记和使用unicode bom。unicode bom在尽可能低的级别(即unicode规范本身)进行了标准化,因此应该在任何地方工作,而不仅仅是在(x)HTML或HTTP上。它适用于脚本、样式表、文本/纯文档,通过HTTP、TCP、mail,您可以命名它。唯一的问题是一些遗留的软件阻塞了BOM…但是…如果我们都开始使用它,我们就强迫供应商修复它。
- @Stijndewitt:如果您需要支持其他编码(如ISO-XXX或日语编码),那么Unicode BOM将如何帮助您呢?此外,虽然BOM是标准化的,但标准实际上建议不要使用带有UTF-8的BOM;例如,请参见回答没有BOM的UTF-8和UTF-8之间有什么不同?.
- @SLESKE我认为标准的作者在编写FAQ时认为,使用不带BOM的UTF-8将提供与旧软件的最佳互操作性,因为它将与ASCII相匹配。但是,我们现在已经超过十年了,UTF8支持几乎无处不在。我支持我的观点,即BOM是存储编码的最佳位置,因为它可以在网络、文件系统甚至数据库中生存。不过,我还是添加了HTTP头,甚至还有一个元标记。
- 型utf-8没有bom:因为只有一个字节顺序(没有大/小的endien);因为ascii是utf-8,而bom不是ascii。这将破坏仅为ASCII的页面。有些系统使用ASCII/UTF-8,添加一个BOM会破坏一些旧软件)。这些系统建立在旧的基础上,以生成一个非常好和健壮的系统,而不需要每次添加新功能时都将旧的系统彻底删除。
- 型UTF-8确实有一个BOM。它的目的不是确定字节顺序,而是确定所使用的编码是UTF-8。"UTF-8可以包含物料清单。但是,它与字节流的结束地址没有区别。UTF-8总是有相同的字节顺序。初始的bom仅用作签名-表示未标记的文本文件是UTF-8格式的。"unicode.org/faq/utf_bom.html_bom5
- 型另外,请注意,ASCII是UTF-8的一个子集,但反过来显然不正确。因此,如果您的文本只包含ASCII,那么就省去BOM(使其有效地成为ASCII)。只要您的文本可能包含非ASCII字符,向后兼容性就会被破坏,您应该添加一个BOM。
- 型HTML文件具有编码的一个原因是,尽管假定HTTP应该指定编码,但大多数用户没有对其服务器的控制权。与要求每台服务器以某种方式允许用户为所服务的每一个文件指定编码的海洋解决方案不同,用户显然需要一种方法来指定文件本身的编码。至于UTF-8吨级的BOM,即使在2019年也无法使用。不管是否有某种工程上的理想,实用的解决方案都是在HTML文件中使用字符集,在UTF-8文件中没有任何BOM。
在HTML5中,它们是等效的。用短一点的,更容易记住和打字。浏览器支持很好,因为它是为向后兼容而设计的。
- 浏览器支持呢?在IE6中工作吗?
- 据我所知,是的。
- 这是谷歌代码页的更新链接,@?IME VIDAS提到。它说,对于IE 6、7和8,"在非IE浏览器中,可以使用document.characterset。在IE中,您可能认为可以对.getElementsByTagname('meta')[0].charset进行文档记录,但这只返回指定的字符编码,而不是IE实际使用的编码。"
- 我知道这个线程很旧,但是gtmetrix.com/specify-a-character-set-early.html表明使用设置字符编码会禁用IE8中的lookahead下载程序,这会影响页面加载时间。是的,是的,我知道…下降IE8。@M&233;SZ&225;Roslajos可以在几年后回到这里,继续支持IE8。;-)
- developer.mozilla.org/en-us/docs/web/guide/html/&hellip;对我来说,这是对这个答案的一个很好的确认。
- 今天我有一个问题,韩国符号没有出现在IE11中。去掉短语法而不是长语法,解决了这个问题。我不知道这是因为某种服务器配置,还是因为IE11和字符集的问题。它失败的确切符号组合是??
- 旧的和新的一起出去。要求更好的改变。同样的事情做起来更容易,如果你生活在一个有着古老技术的洞穴里…太糟糕了!要求更好的改变。
- 我发现Chrome更喜欢"长"的形式,而火狐更喜欢"短"的形式,他们的偏好是互斥的。我在SVG里找到了这个带有UTF-8的。HTML5 doctype上的"long"表单在firefox中不起作用,HTML5 doctype上的"short"表单在chrome中也不起作用,我必须同时使用这两种浏览器才能使两种浏览器都起作用。
- 今天,我偶然发现了由模板生成的Excel电子表格,如果在Linux服务器上生成,本地Windows机器的语法就会被破坏。更改输出文件中的长语法固定编码
- 为什么元标签中的charset很重要?,在哪里使用?或者说,在HTML中,charset的优势是什么?
- 如果有疑问,我通常会选择更简单的选择。但是,既然人们都在报告每个选项的问题,为什么不两者都有呢?
- 我在FF最新的dev版本中使用了,但没有使用另一个版本。怎样?
- @阿弥陀佛-如果你有一个新问题,那就问一个,不要留下评论。确保包含一个最小、完整和可验证的示例,并提到浏览器的特定版本号。
- @昆汀是什么让你觉得这是个新问题?如果我发布新的问题,它将与上面相同,也可以被视为重复。我的问题很简单,与给出的答案相反。如果两个标签相同,那么为什么其中一个标签在FF中抛出警告?这也是最新支持的HTML5格式一。在FF的最新开发版本中也是如此。如果这是真的,那么这意味着上面的答案是错误的。
- @amitshah-因为您对某些特定的代码有一个特定的问题。您的代码有问题,或者"FF的最新开发人员版本"有问题。
- 在服务器端解析文档或为服务器提供文档服务时使用较长的文档,因为这些文档通常已过时。
两种形式的元字符集声明都是等效的,并且应该在浏览器中工作相同。但是,在将Web文件字符集声明为utf-8时,需要记住以下几点:
以utf-8编码保存文件,不带字节顺序标记(bom)。
使用元字符集(如上所述)在HTML文件中声明编码。
Web服务器必须为您的文件提供服务,在内容类型HTTP头中声明UTF-8编码。
默认情况下,Apache服务器配置为服务于ISO-8859-1中的文件,因此需要将以下行添加到您的.htaccess文件中:
这将配置Apache为您在内容类型响应头中声明UTF-8编码的文件提供服务,但您的文件必须以UTF-8(不带BOM)保存才能开始。
没有BOM,记事本无法以UTF-8格式保存文件。一个免费的编辑器,可以是记事本++。在程序菜单栏上,选择"Encoding>Encode in utf-8 without bom"。您还可以使用"编码>转换为不带BOM的UTF-8"打开文件并以UTF-8格式重新保存它们。
更多关于维基百科的字节顺序标记(bom)。
- @codeboy我会修改你的答案,说"你应该保存……没有bom。"下一页说"…省略bom通常对互操作性最好…",表示最佳实践,但不是要求:w3.org/international/questions/qa-byte-order-mark
- 在IIS中,可以使用web.config中的在http头中设置字符集-将其添加到
- 我只花了30分钟想弄明白为什么你的Charset提示不适合我。您可能需要将default.html重命名为index.html(或其他文件名)。在default.html中,Apache似乎很难设置某些默认值!
- 据我所知,如果你用我们的无BOM存钱根本不重要。
- 老实说,比起Apache,我更喜欢一个易于配置的Web服务器。@ Dabbu
- 谢谢!这些信息有助于我开发我的实时HTML/CSS/JS代码编辑器(liveditor.com)。上一次我尝试使用PHP解析器(.dll)时,在使用bom的utf8格式处理文件时出现问题-它输出bom字节!我不明白为什么它检测不到BOM…
- 在某些情况下,BOM确实会产生影响。在处理UTF-16时需要这样做,因为RFC2781第4.3节说默认编码是big endian,但是由于Windows默认使用小endian,所以大多数软件也会使用le。为了避免对内容的任何错误解释,BOM非常方便。在某些情况下,这可能是有害的,在使用PHP时,解释器有时会输出BOM,并在尝试输出某些HTTP头时出错。总结:UTF-8不用BOM,UTF-16不用BOM。
- 为什么说utf-8html应该没有bom?拥有一个物料清单应该很好。另外,您不需要meta和HTTP头。您只需要一个bom、meta或http头。
- 如何让Visual Studio停止作恶并始终添加UTF-8 BOM?对于Tomcat,还必须向每个连接器添加URIEncoding="utf-8"。
- 您指定HTML内容类型,为什么要使用元字符集?我认为这是多余的,对吧?
- @Richard只使用头部的一个问题是,如果用户将HTML文件保存到磁盘上,编码将丢失。只使用meta标签是可以的,但是它会让浏览器做一些额外的解析。因此,我认为,尽管存在冗余,但使用这两种方法都应被视为最佳实践。
- Why do you say UTF-8 HTML should be without a BOM实际上,缺少BOM正是您首先需要HTTP头或元标记的原因。
- 我不同意这一点。UTF-8格式的BOM对于发送编码类型的信号非常有用。否则我们必须猜测,或者使用这个问题所指的元标签之类的东西。bom最酷的地方是它是unicode规范的一部分,因此可以用于所有用unicode编码的数据,而不仅仅是HTML。我们应该做的是在任何地方使用bom,让遗留软件爆炸,报告这些错误并修复它们。
使用短字符集的另一个原因是它与在标记中指定字符集的其他实例相匹配。例如:好的。
1 2 3 4 5
| <script type="javascript" charset="UTF-8" src="/script.js">
<p>
Example Site
</p>Ok. |
一致性有助于减少错误并提高代码的可读性。好的。
注意,charset属性不区分大小写。您可以使用utf-8或utf-8,但是utf-8更清晰、更可读、更准确。好的。
此外,在meta-charset属性或页标题中,绝对没有理由使用除utf-8以外的任何值。自1999年HTML4以来,UTF-8是Web文档的默认编码,也是制作现代Web页面的唯一实用方法。好的。
此外,不应使用UTF-8格式的HTML实体。像版权符号这样的字符应该直接输入。您应该使用的唯一实体是5个保留标记字符:小于、大于、与号、质数、双质数。实体需要一个HTML解析器,您可能并不总是希望使用这种解析器,它们会引入错误,降低代码的可读性,增加文件大小,有时还会在不同的浏览器中错误地解码,具体取决于您使用的实体。了解如何键入/插入版权、商标、左引号、右引号、撇号、em-dash、en-dash、bullet、euro以及在内容中遇到的任何其他字符,并在代码中使用这些实际字符。Mac有一个字符查看器,您可以在"键盘系统"首选项中打开它,您可以查找并拖放所需的字符,或者使用匹配的键盘查看器查看要键入的键。例如,商标是选项+2。UTF-8包含了每种书面人类语言的所有字符和符号。所以没有理由使用——而不是一个长划。学习标点和排版的规则也不错…例如,知道句点位于右引号内,而不是位于右引号外。好的。
Using a tag for something like content-type and encoding is highly
ironic, since without knowing those things, you couldn't parse the file
to get the value of the meta tag.
Ok.
不,那不是真的。浏览器开始将文件解析为浏览器的默认编码,即utf-8或iso-8859-1。由于us-ascii是iso-8859-1和utf-8的一个子集,所以无论哪种方式,浏览器都可以很好地读取…它是一样的。当浏览器遇到元字符集标记时,如果编码与浏览器已经使用的编码不同,则浏览器将以指定的编码重新加载页面。这就是为什么我们把元字符集标签放在顶部,在头标签之后,在任何其他东西之前,甚至是标题之后。这样就可以在标题中使用utf-8字符。好的。< Buff行情>
必须以UTF-8编码保存文件,而不使用BOM好的。< /块引用>
这并非完全正确。如果文档中只有us-ascii字符,则可以将其保存为us-ascii并作为utf-8使用,因为它是一个子集。但是如果有Unicode字符,您是正确的,您必须保存为不带BOM的UTF-8。好的。
If you want a good text editor that will save your files
in UTF-8, I recommend Notepad++.
Ok.
在Mac上,使用Mac应用商店的Bare Bones TextWrangler(免费)或Mac应用商店的Bare Bones BBedit(39.99美元)。这么好的工具很便宜。在任一应用程序中,在文档窗口的底部都有一个菜单,您可以在其中指定文档编码,并且可以轻松地选择"UTF-8无BOM"。当然,您可以在首选项中将其设置为新文档的默认值。好的。
But if your Webserver serves the encoding in the HTTP header,
which is recommended, both [meta tags] are needless.
Ok.
这是不正确的。当然,您应该在HTTP头中设置编码,但是您也应该在meta-charset属性中设置编码,这样用户就可以将页面保存在浏览器外的本地存储中,然后在以后再次打开,在这种情况下,将出现的编码的唯一指示就是meta-charset属性。您还应该为同样的原因设置一个基标记…在服务器上,基标记是不必要的,但是当从本地存储中打开时,基标记使页面能够像在服务器上一样工作,并且所有资产都已就位等等,没有断开的链接。好的。
AddDefaultCharset UTF-8
Ok.
或者您只需更改特定文件类型的编码,如下所示:好的。
1
| AddType text/html;charset=utf-8 html |
为utf-8和拉丁-1(iso-8859-1)文件提供服务的一个技巧是为utf-8文件提供"文本"扩展名和拉丁-1文件"txt"。好的。
1 2
| AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text |
最后,考虑使用Unix行尾保存文档,而不是传统的DOS或(经典的)Mac行尾,这些行尾对您没有帮助,而且可能会造成伤害,尤其是当我们进一步远离这些传统系统时。具有有效HTML5、UTF-8编码和Unix行尾的HTML文档做得很好。您可以在许多上下文中共享、编辑、存储、读取、恢复和依赖该文档。这是通用语。是数码纸。好的。好啊。
- "如果文档中只有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不同。
- 你关于HTML实体的观点很好。在过去,我只使用实体来发现它们在保存到不同的系统和/或在不同的编辑器中打开后被转换为UTF-8字符。但是,值得注意的是,不间断空格(amp;nbsp;)可能会产生令人困惑的结果,因为您通常不会在编辑器中看到它们,因此为了清晰起见(以我的经验),通常最好将它们作为实体保存。
- 我已经编辑了答案来解决上面发现的问题。
- "You should also set a base tag..."应附带此处所述的注意事项。
- 另一个您可能更喜欢HTML实体的原因是,如果您使用的是类似于IONCONS的东西。我宁愿看到,而不是默认的标志符号,或者一些我不认识的奇怪字符。
HTML5引入了。
如文档中所述,两者都是有效的。但是,只适用于HTML5(而且更容易输入/记忆)。
在不久的将来,旧样式必然会被弃用。我会坚持使用新的。只有一条路,但往上走。在技术方面,这是逐步淘汰旧的(真的,真的很快)
文档:html meta charset attribute-w3schools
- 关于链接,请参见meta.stackoverflow.co m/questions/280478/why-not-w3schools-co&zwnj;&8203;m
虽然没有对其他答案提出质疑,但我认为以下内容值得一提。
"长"(http-equiv符号和"短"符号相等,以先赢者为准;
Web服务器头将覆盖所有标记;
bom(字节顺序标记)将覆盖所有内容,在许多情况下,它将影响HTML 4(可能还有其他东西);
如果不声明任何编码,您可能会得到定义了浏览器的"回退文本编码"中的文本。无论是在火狐还是Chrome中,它都不是UTF-8;
在没有其他线索的情况下,浏览器会尝试像使用ASCII一样读取您的文档以获取编码,因此您不能使用任何奇怪的编码(不过,使用BOM的UTF-16应该可以);
虽然规范说编码声明必须在文档的前512个字节内,但大多数浏览器将尝试读取更多的内容。
您可以通过运行echo 'HTTP/1.1 200 OK
Content-type: text/html; charset=windows-1251
\xef\xbb\xbf
приветпривет' | nc -lp 4500并将浏览器指向
localhost:4500来进行测试。(当然,您需要更改或删除部件。物料清单部分为
\xef\xbb\xbf。注意外壳的编码。)
请注意,显式声明编码非常重要。让浏览器猜测可能会导致安全问题。
- 很好,但您能详细说明您所指的安全问题吗?
- 长的符号不应该覆盖短的符号,只是文档中的第一个符号应该获胜。
- @我记得,以前我的脚和UTF-7有问题。此外,在网络上嗅探通常是不好的,例如,当你上传图像时,嗅探到的内容被当作脚本内容。
- @GSNEDDERS在Chrome和Firefox中测试过,你说得对。相应地编辑了答案。阿姆福特:大概是7位编码,不记得具体是什么。
- "无论是在火狐还是Chrome中,它都不是UTF-8"——什么意思?如果不是UTF-8,那是什么?
- @Craigmcqueen非常肯定浏览器的回退(在2018年)仍然默认西欧的浏览器,所以我认为它默认为在每个区域中占主导地位的任何Unicode前编码。用户可以将回退设置为utf-8,但这只会暴露出所有糟糕的编码方式,成千上万的站点仍然用作华丽的高字节ASCII字符,因此仍然不常见。更可惜的是。如果没有浏览器供应商的一点强制,就看不到这种情况会发生什么变化,而且他们也不想破坏传统的东西。
在使用HTML5时,请将用于Web浏览器。
当使用HTML4或XHTML时,或者对于过时的DOM解析器(如PHP中的domDocument)使用。
有一些基于Mozilla基金会和SITEPONT的新闻
Do not use this value (http-equiv=content-type) as it is obsolete.
Prefer the charset attribute on the <meta> element.