为什么要指定@charset“ UTF-8”;在您的CSS文件中?


173

我一直将这条指令视为移交给我的众多CSS文件的第一行:

@charset "UTF-8";

它是做什么的,这是必要的规则吗?

另外,如果我在“ head”元素中包含此meta标签,是否就不需要在CSS文件中也包含它了?

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

Answers:


123

它告诉浏览器以UTF-8格式读取css文件。如果您的CSS包含unicode字符而不仅是ASCII,那么这很方便。

在meta标签中使用它很好,但仅适用于包含该meta标签的页面。

在CSS 2 的w3c规范中了解CSS 文件的字符集解析规则。


7
如果您从非UTF-8站点链接这些文件,也很重要,例如:如果一个CSS站点未声明其编码,那么一个编码为UTF-16的日本网站试图从CDN加载CSS将会得到无法读取的内容。编码。
扑热息痛

147

这在不按HTTP标头或其他元数据(例如本地文件系统)告知编码的情况下很有用。

想象以下样式表:

[rel="external"]::after
{
    content: ' ↗';
}

如果读者将文件保存到硬盘驱动器上,而您忽略了该@charset规则,则大多数浏览器将以OS的语言环境编码(例如Windows-1252)读取该文件,并插入-而不是箭头。

不幸的是,您不能依赖此机制,因为这种支持非常罕见。请记住,在网络上,HTTP标头将始终覆盖@charset规则。

确定样式表字符集的正确规则按优先级顺序排列:

  1. HTTP字符集标头。
  2. 字节顺序标记。
  3. 第一条@charset规则。
  4. UTF-8。

最后一条规则是最弱的,它在某些浏览器中失败。HTML 5中的中
charset属性<link rel='stylesheet' charset='utf-8'>已过时
注意不同声明之间的冲突。它们不容易调试。

推荐读物


您是说要让CSS文件带有content-type:text/css;charset=utf-8标头吗?
Pacerier

1
@Pacerier是的,如果那是HTML文件的编码(应该是)。
fuxia

我的意思是不是已经暗示,如果没有字符集,css文件的字符集应解释为与嵌入HTML文件的字符集相同?
Pacerier

1
@Pacerier我观察到并非总是如此。
MatTheCat

3

在每个包含文本的页面上始终包含字符集规范的原因之一是避免跨站点脚本漏洞。在大多数情况下,UTF-8字符集是文本(包括HTML页面)的最佳选择。


2

如果要在CSS文件中放入<meta>标记,则说明您做错了什么。<meta>标记属于您的html文件,它告诉浏览器html的编码方式,它没有说明css,它是一个单独的文件。可以想象,您的html和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.