层叠样式表第2级 CSS2规范开发手册 - WEB前端开发 专注前端开发,关注用户体验

4 CSS2语法和基本数据类型

    目录

4.1 语法

    本节讨论了对于任一版本的CSS(包括CSS2)都相同的语法(及向下兼容的解析规则)。CSS以后的版本将保持这一核心语法,尽管它们可以加入额外的语法限制。

    这些描述是标准化的。在附录 D中的语法规则是它们的补充和完善。

4.1.1 表征化

    CSS的所有级别——级别1,级别2以及将来的级别——都使用相同的核心语法。这就可以让用户端解析(尽管不是完全理解)样式表,而这些样式表可能是以用户端出现时还没有的CSS级别写成的。设计者以此来创建可以在老的用户端上工作的样式表,同时又保持使用最新级别的CSS。

    在词汇级别,CSS样式表包含一系列的表征。CSS2的表征见下表所列。定义采用Lex样式规范表达式。八进制数参见ISO 10646([ISO10646])。在Lex中,如果出现多重匹配,则最长的那个匹配决定了表征。
表征定义

IDENT {ident}
ATKEYWORD @{ident}
STRING {string}
HASH #{name}
NUMBER {num}
PERCENTAGE {num}%
DIMENSION {num}{ident}
URI url\({w}{string}{w}\)
|url\({w}([!#$%&*-~]|{nonascii}|{escape})*{w}\)
UNICODE-RANGE U\+[0-9A-F?]{1,6}(-[0-9A-F]{1,6})?
CDO <!--
CDC -->
; ;
{ \{
} \}
( \(
) \)
[ \[
] \]
S [ \t\r\n\f]+
COMMENT \/\*[^*]*\*+([^/][^*]*\*+)*\/
FUNCTION {ident}\(
INCLUDES ~=
DASHMATCH |=
DELIM any other character not matched by the above rules

    上述包含在花括号({})中的宏的定义如下:
定义

ident {nmstart}{nmchar}*
name {nmchar}+
nmstart [a-zA-Z]|{nonascii}|{escape}
nonascii[^\0-\177]
unicode \\[0-9a-f]{1,6}[ \n\r\t\f]?
escape {unicode}|\\[ -~\200-\4177777]
nmchar [a-z0-9-]|{nonascii}|{escape}
num [0-9]+|[0-9]*\.[0-9]+
string {string1}|{string2}
string1 \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"
string2 \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'
nl \n|\r\n|\r|\f
w [ \t\r\n\f]*

    下面是CSS的核心语法。接下去的一节讨论了如何使用它。附录 D描述了一个更加严格的语法,它更接近于CSS级别2的语言。

stylesheet  : [ CDO | CDC | S | statement ]*;
statement   : ruleset | at-rule;
at-rule     : ATKEYWORD S* any* [ block | ';' S* ];
block       : '{' S* [ any | block | ATKEYWORD S* | ';' ]* '}' S*;
ruleset     : selector? '{' S* declaration? [ ';' S* declaration? ]* '}' S*;
selector    : any+;
declaration : property ':' S* value;
property    : IDENT S*;
value       : [ any | block | ATKEYWORD S* ]+;
any         : [ IDENT | NUMBER | PERCENTAGE | DIMENSION | STRING
              | DELIM | URI | HASH | UNICODE-RANGE | INCLUDES
              | FUNCTION | DASHMATCH | '(' any* ')' | '[' any* ']' ] S*;

    COMMENT表征不在语法中出现(为了使语法更容易读)。不过,任意数目的这些表征可以出现在其它表征间的任何地方。

    上述语法中的S表征表示空白。只有字符“空格”(Unicode编码32),“制表符”(9),“换行”(10),“回车”(13)以及“换页”(12)可以出现在空白中。其它类似空格的字符,如“em-space”(8195)和“表意空格”(12288)肯定不是空白的一部分。

4.1.2 关键字

    关键字以标识符的形式出现。关键字不可以放置在引号("..."或'...')之间。因此,

red

    是一个关键字,而

"red"
    则不是。(它是一个字符串。)其它不合法的例子如:

不合法的例子:

    

width: "auto";
border: "none";
font-family: "serif";
background: "red";

4.1.3 字符和大小写

     下面的规则总是有效:

4.1.4 语句

     任何版本的CSS的CSS样式表,包含一系列的语句(见上面的语法)。有两种语句:@规则规则集。语句周围可以有空白

    本规范中,术语“紧接在前”或“紧跟在后”表示其中没有插入空白或注解。

4.1.5 @规则

     @规则以一个关键字@开始,紧跟在后的是一个标识符(如'@import','@page')。

     一个@规则包括到下一个分号(;)或下一个间的所有内容(以先出现的为分界)。CSS用户端一旦遇上不认识的@规则,它必须忽略这一规则,并继续其后的解析。

    CSS2用户端必须忽略内出现或在其它任何一个规则集之后出现的任何'@import'规则。

不合法的例子:

    假定一个CSS2解析器遇到如下的样式表:

@import "subs.css";
H1 { color: blue }
@import "list.css";

    根据CSS2,第二个'@import'是非法的。CSS2解析器忽略整个@规则,从而有效的样式表缩减为:

@import "subs.css";
H1 { color: blue }

不合法的例子

    下面这个例子中,第二个'@import'规则是无效的,因为它出现在一个'@media' 中。

@import "subs.css";
@media print {
  @import "print-main.css";
  BODY { font-size: 10pt }
}
H1 {color: blue }

4.1.6

     A 以一个左花括号({)开始,并以相匹配的右花括号(})结束。在其间,可以是任何字符。但是,括号(( )),方括号([ ])和花括号({ })必须成对出现,并可以嵌套。单引号(')和双引号(")也必须成对出现,其间的字符被解析为一个字符串。字符串的定义参见上面的表征化

不合法的例子:

     这里是一个块的例子。注意,双引号内的右花括号并不匹配本块开始的花括号。而第二个单引号是在转义字符中,从而不匹配第一个单引号:

{ causta: "}" + ({7} * '\'') }

    注意,上例尽管不是有效的CSS2,但还是一个块的定义。

4.1.7 规则集,声明块和选择子

     一个规则集(也称为“规则”)包含一个选择子,以及随后的声明块。

    一个声明块(下文中也称为{}块)以左花括号开始({),以与之匹配的右花括号(})结束。其间是零个或多个以分号(;)分割的声明的列表。

    选择子(参见选择子一节)包含延伸到(但是不包含)第一个左花括号({)的所有内容。 一个选择子总是和一个{}块相随。如果用户端无法解析选择子(例如,它不是有效的CSS2),它也必须忽略{}块。

    CSS2赋予选择子中的逗号(,)以特殊的含义。不过,由于还不知道在将来的CSS版本中逗号是否会获得其它的含义,当选择子中任何地方出错后,即使选择子的其它部分可能看起来和CSS2吻合,但是整个语句将被忽略

不合法的例子:

    例如,由于"&"在CSS2中不是一个有效的表征,CSS2用户端必须忽略整个第二行,也不把H3的颜色设置为红色。

H1, H2 {color: green }
H3, H4 & H5 {color: red }
H6 {color: black }

例子:

    下面是一个更复杂的例子。前两对花括号在字符串中,并不标记着选择子的结束。它是一个有效的CSS2语句。

P[example="public class foo\
{\
    private int x;\
\
    foo(int x) {\
        this.x = x;\
    }\
\
}"] { color: red }

4.1.8 声明属性

    一个声明要么为空,要么包含一个属性,随后是一个冒号(:),随后是一个值。其间可以有空白

    鉴于选择子工作的方式,同一选择子的多重声明可以组成以分号(;)分割的组。

例子:

    因此,下面的规则:

H1 { font-weight: bold }
H1 { font-size: 12pt }
H1 { line-height: 14pt }
H1 { font-family: Helvetica }
H1 { font-variant: normal }
H1 { font-style: normal }

    就等同于:

H1 {
  font-weight: bold;
  font-size: 12pt;
  line-height: 14pt;
  font-family: Helvetica;
  font-variant: normal;
  font-style: normal
}

    一个属性是一个标识符。值中可以出现任何字符,不过括号("( )"),花括号("{ }"),单引号(')和双引号(")必须匹配成对出现。而不在字符串中的分号必须转义。括号,方括号和花括号可以嵌套。在引号中,字符解析为一个字符串。

    的语法由各属性单独规定。在任何情况下,值的构成包含标识符,字符串,数值,长度,百分比,URI,颜色,角度,时间和频率等。

    用户端必须忽略带有无效属性名或无效值的声明。每一个CSS2属性都有它自己的语法和语义的限制,规定它可以接受的值。

不合法的例子:

    例如,我们假定CSS2解析器遇到如下的样式表:

H1 { color: red; font-style: 12pt }  /* 无效值:12pt */
P { color: blue;  font-vendor: any;  /* 无效属性:font-vendor */
    font-variant: small-caps }
EM EM { font-style: normal }

     第一行中,第二个声明带有一个无效值'12pt'。第二行的第二个声明包含未定义的属性'font-vendor'。CSS2解析器将忽略这些声明,从而有效的样式表缩减为:

H1 { color: red; }
P { color: blue;  font-variant: small-caps }
EM EM { font-style: normal }

4.1.9 注解

    注解以字符"/*"开始,并以字符"*/"结束。它们可以在表征之间的任何位置出现,它们的内容对渲染没有任何影响。注解不能嵌套。

    CSS也允许SGML注解的分割符("<!--"及"-->")出现在某些特定的地方,但是它们不分割CSS的注解。允许SGML注解的分割符可以使样式规则出现在HTML源文档中的STYLE元素内,并且对于3.2版本以前的HTML用户端是不可见的。更多的信息,请参见HTML 4.0规范([HTML40])。

4.2 解析错误的处理规则

    某些情况下,用户端必须忽略一个不合法的样式表的一部分。本规范定义忽略的含义是用户端解析不合法的部分(以找到它的开始和结束),但是不加以任何处理,就如同它不存在那样。

    为了保证在将来能为已有的属性加入新的值或加入新的属性,用户端在碰到如下情形时,必须遵循如下规则:

4.3

4.3.1 整型和实型数

    某些值的类型可以包括整型值(表示为<integer>)或实型值(表示为<number>)。实型和整型数都只以十进制符号表示。<integer>包括一个或多个数字"0"到数字"9"。<number>可以是一个<integer>,或者在点号(.)后接零个或多个数字。整数和实数可以前缀一个"-"或"+"来表示符号。

    注意,很多接受整数和实数作为其值的属性实际上会有取值范围的限制,通常是非负值。

4.3.2 长度

    长度是指水平或垂直方向的度量。

    长度值的格式(本规范中表示为<length>)为:一个可选的符号字符('+'或'-','+'是缺省的符号),紧接在后的是一个<number>(小数点可有可无),紧接在后的是一个单位标识符(如px,deg等等)。在'0'长度之后,单位标识符可以省略的。

    某些属性允许负的长度值,不过这将使格式化模型变得复杂,并可能伴随着与实现相关得限制。如果不能支持负的长度值,它应该被转换到最接近的可以被支持的值。

    有两种类型的长度单位:相对的和绝对的。 相对长度单位规定一个长度相对于另外一个长度属性。使用相对单位的样式表在从一个媒介转移到另一个媒介(如从计算机显示器到激光打印机)时,定比会相对简单一些。

    相对单位有:

例子:

    

H1 { margin: 0.5em }      /* em */
H1 { margin: 1ex }        /* ex */
P  { font-size: 12px }    /* px */

    'em'单位等于应用该单位的元素的经计算的'font-size'属性。例外情况是'font-size'值本身出现了'em',这时它参考其父元素的字体尺寸。它可以用作垂直和水平的度量。(在印刷文本中,这个单位也有时被称为四方宽度。)

    'ex'单位定义为字体的'x-height'。之所以叫x-height,是因为它通常等于小写字母'x'的高度。不过,即使字体中没有x字母,'ex'还是会有定义。

例子:

    规则:

H1 { line-height: 1.2em }

    指H1元素的行高比H1元素的字体尺寸大20%。另一方面:

H1 { font-size: 1.2em }

    指H1元素的字体尺寸比H1元素继承来的字体尺寸大20%。

    如果出现在文档树根节点(如HTML中的"HTML")时,'em'和'ex'参考属性的初始值

    像素点单位相对于浏览设备的分辨率。在大多数情况下是指计算机的显示器。

    如果输出设备与典型的计算机显示器相比,像素点密度有很大的差别,用户端应该重新定比像素点值。 我们推荐将参考像素点定义为具有90dpi像素点密度的设备上的一个像素点,离开读者有一臂的长度时的视角。通常的手臂长度有28英寸,因此视角大约为0.0227度。

    如果阅读距离是一个手臂的长度,那么1px相应于大约0.28毫米(1/90英寸)。如果打印到激光打印机,意味着阅读距离比手臂长度短(55厘米或21英寸),1px大约是0.21毫米。在300dpi的打印机上,大概会占据三个点(0.25毫米);在600dpi的打印机上,大概会占据五个点。

    下面的两个图形演示了视距对于像素点的尺寸的影响,以及设备分辨率的影响。在第一个图形中,阅读距离为71厘米(28英寸)时,一个像素点大小为0.28毫米;如果阅读距离为3.5米(12英尺)时,一个像素点大小为1.4毫米。

    Showing that pixels must become
larger if the viewing distance increases   [D]

    在第二个图形中,一个大小为1px宽,1px高的区域在低分辨率的设备(计算机屏幕)上由一个点覆盖,而同样的区域在高分辨率设备(如400 dpi的激光打印机)上,需要16个点来覆盖。

    Showing that more device pixels (dots)
are needed to cover a 1px by 1px area on a high-resolution device than
on a low-res one   [D]

    子元素并不继承由其父元素指定的相对值,它们(通常)继承计算值

例子:

    下面的规则中,计算出的H1元素的'text-indent'值是36pt,而不是45pt,如果H1是BODY元素的子元素的话。

BODY {
  font-size: 12pt;
  text-indent: 3em;  /* i.e., 36pt */
}
H1 { font-size: 15pt }

     绝对长度单位只有在其输出媒介的物理特性已知的情况下才有用。绝对单位有:

例子:

    

H1 { margin: 0.5in }      /* 英寸  */
H2 { line-height: 3cm }   /* 厘米 */
H3 { word-spacing: 4mm }  /* 毫米 */
H4 { font-size: 12pt }    /* 点 */
H4 { font-size: 1pc }     /* picas */

    如果指定的长度不被支持,用户端必须将其近似为实际值。

4.3.3 百分比

    百分比值的格式(本规范中表示为<percentage>)为:一个可选的符号字符('+'或'-','+'是缺省值),紧接在后的是一个<number>,紧接在后的是'%'。

    百分比值总是相对于另外一个值,如长度。允许百分比值的每一个属性也定义了百分比所参考的值。这个值可以是同一元素的另外一个属性的值,其前辈元素的属性值,或者格式化上下文的值(如包含块的宽度)。如果元素的属性指定了百分比值,而百分比值又被定义为参考某个属性的继承值,那么结果值就是百分比乘以那个属性的初始值

例子:

    由于子元素(通常)继承其父元素的计算值,下例中,P元素的子元素的'line-height'将继承12pt的值,而不是百分比值(120%)

P { font-size: 10pt }
P { line-height: 120% }  /* 120% of 'font-size' */

4.3.4 URL + URN = URI

    URL(统一资源定位,参见[RFC1738][RFC1808])提供了网络上一个资源的地址。可以预见的一个定位资源的新方法称为URN(统一资源名称)。两者结合称为URI(统一资源标识符,参见[URI])。本规范使用术语URI。

    本规范中,URI值表示为<uri>。用来在属性值中指定URI的函数符号是"url()",如:

例子:

    

BODY { background: url("http://www.bg.com/pinkish.gif") }

    URI值的格式是:'url(',后跟可选的空白,后跟可选的单引号或双引号,后跟URI本身,后跟可选的单引号或双引号,后跟可选的空白,后跟')'。两个引号字符必须一致。

例子:

    没有引号的例子:

LI { list-style: url(http://www.redballs.com/redball.png) disc }

    括号,逗号,空白字符,单引号和双引号如果出现在URI中,则必须用反斜杠转义:'\(','\)','\,'。

    根据URI的类型,也可能将上述字符写成URI转义(其中"(" = %28,")" = %29,等等)。参见[URI]

    为了创建不依赖于资源的绝对位置的模板样式表,作者可以使用相对URIs。相对URI(定义见[RFC1808])根据基准URI解析为完全URI。RFC 1808的第3节定义了这一过程的标准化算法。对于CSS样式表,基准URI是样式表的位置,而不是源文档的位置。

例子:

    例如,假定如下的规则:

BODY { background: url("yellow") }

    定位在由如下URI指定的样式表中:

http://www.myorg.org/style/basic.css

    则源文档BODY的背景将由如下URI指定的图形资源堆叠而成(不管那个图形是什么):

http://www.myorg.org/style/yellow

    用户端在处理指定不可获得或不适用的资源的URI时,方法可能不同。

4.3.5 记数器

    记数器表示为标识符(参见'counter-increment''counter-reset'属性)。要引用一个记数器的值,可以采用'counter(<identifier>)'或'counter(<identifier>, <list-style-type>)'。缺省的样式是'decimal'。

    要引用有相同名称的嵌套记数器序列,采用'counters(<identifier>, <string>)'或'counters(<identifier>, <string>,<list-style-type>)'。参见生成的内容一章中的“记数器嵌套和作用范围”

    CSS2中,记数器的值只可以由'content'属性引用。注意,'none'也是一个可能的<list-style-type>:'counter(x, none)'返回一个空字符串。

例子:

    下面的样式表为每一章(H1)中的段落(P)进行编号。编号的方式是以罗马数字编号,后接一个点和一个空格:

P {counter-increment: par-num}
H1 {counter-reset: par-num}
P:before {content: counter(par-num, upper-roman) ". "}

    记数器如果不在任何'counter-reset'的范围内,则可以认为它被根元素的'counter-reset'重新置为0。

4.3.6 颜色

<颜色>或者是一个关键字,或一个RGB数字。

     颜色名称的关键字列表为:aqua,black,blue,fuchsia,gray,green,lime,maroon,navy,olive,purple,red,silver,teal,white和yellow。这16个颜色定义在HTML 4.0([HTML40])中。除了这些颜色的关键字,用户也可以指定在用户环境中特定对象使用的颜色所对应的关键字。详细内容请参见系统颜色一节。

例子:

    

BODY {color: black; background: white }
H1 { color: maroon }
H2 { color: olive }

    RGB颜色模型用在颜色的数字表示中。下面这些例子都指定了相同的颜色:

例子:

    

EM { color: #f00 }              /* #rgb */
EM { color: #ff0000 }           /* #rrggbb */
EM { color: rgb(255,0,0) }      /* 整数值范围 0 - 255 */
EM { color: rgb(100%, 0%, 0%) } /* 实数值范围 0.0% - 100.0% */

     以十六进制表示的RGB值的格式为:'#'号,紧接在后的是三个或六个十六进制字符。三位的RGB表示通过重复数字(而不是加零)转化到六位的RGB表示。例如,#fb0扩展为#ffbb00。这样保证了白色(#ffffff)可以简缩表示为#fff,并消除了对于显示的颜色深度的依赖性。

    在函数表示中的RGB值的格式为:'rgb(',紧接在后的是用逗号分割的,三个数值(可以是三个整数值或三个百分比值),后接')'。整数值255代表100%,相当于十六进制表示的F或FF:rgb(255,255,255) = rgb(100%,100%,100%) =#FFF。数值周围可以有空白字符。

    所有的RGB颜色都定义在sRGB颜色空间中(参见[SRGB])。用户端呈现这些颜色的忠实度可能会有差异。但是使用sRGB给颜色呈现提供了一个没有歧义的、客观的、可衡量的定义,也可以和国际标准相关联(参见[COLORIMETRY])。

    与规范一致的用户端可以通过执行伽玛校正,来限制它们显示颜色的尝试。sRGB规定了在特定浏览条件下,显示伽玛系数为2.2。用户端应该调整在CSS中给出的颜色,和输出设备的“自然”显示伽玛系数相结合,而使有效的显示伽玛系数为2.2。更多的细节,请参见伽玛校正一节。注意,只有在CSS中规定的颜色才受影响;例如,图形可能会自带颜色信息。

    超出设备范围的值要加以修正:必须修改红、绿、蓝的值,使之和设备支持的范围相吻合。对于一个典型的CRT显示器,其设备范围和sRGB相同,下面三个例子的效果一样:

Example(s):

    

EM { color: rgb(255,0,0) }       /* integer range 0 - 255 */
EM { color: rgb(300,0,0) }       /* clipped to rgb(255,0,0) */
EM { color: rgb(255,-10,0) }     /* clipped to rgb(255,0,0) */
EM { color: rgb(110%, 0%, 0%) }  /* clipped to rgb(100%,0%,0%) */

    其它设备,如打印机,和sRGB有不同的设备范围;某些超出0..255的范围的颜色使可以呈现的(在设备范围之内),而其它一些在0..255范围内的颜色会在设备范围之外,从而被加以修正。

    注意:尽管颜色给文档带来可观的信息,并使文档更加容易阅读,但是也要考虑到某些颜色的组合会给色盲的读者带来困难。如果你使用背景图形或设置了背景色,请相应地调整前景颜色。

4.3.7 角度

    角度值(文本表示为<angle>)使用在语音样式表中。

    其格式为:一个可选的符号字符('+'或'-','+'使缺省值),紧接在后的是一个<number>,紧接在后的是一个角度单位标识符。

    角度单位标识符为:

    角度值可以是负数。用户端应该将它们规范到0-360度。如-10度和350度是一样的。

    例如,一个直角是'90度'或 or '100梯度'或'1.570796326794897弧度'。

4.3.8 时间

    时间值(文本表示为<time>)使用在语音样式表中。

    它们的格式是一个<number>,紧跟在后的是一个时间单位标识符。

    时间单位标识符有:

    时间值不可以为负数。

4.3.9 频率

    频率值(文本表示为<frequency>)使用在语音样式表中。

    它们的格式是一个<number>,紧跟在后的是一个频率单位标识符。

    频率单位标识符有:

    频率值不可以是负数。

    例如,200Hz(或200hz)是低音,而6kHz(或6khz)是高音。

4.3.10 字符串

    字符串可以包含在双引号或单引号中。在双引号对中不可以再出现双引号,除非将其转义(如'\"'或'\22')。单引号与此类似("\'"或"\27")。

例子:

    

"this is a 'string'"
"this is a \"string\""
'this is a "string"'
'this is a \'string\''

    一个字符串不可以直接包含新行。要在字符串中包含新行,可以使用转义字符"\A"(十六进制的A在Unicode中表示换行字符,在CSS中表示通用的"newline")。参见'content'属性的例子。

    为了美观或其它别的原因,可以将字符串分成几行。不过在这种情况下,换行本身要加以转义。例如,下面的两个选择子是一样的:

例子:

A[TITLE="a not s\
o very long title"] {/*...*/}
A[TITLE="a not so very long title"] {/*...*/}

4.4 CSS文档呈现

    CSS样式表是通用字符集(参见[ISO10646])中一系列字符的序列。为了传送和寸储的需要,这些字符必须由支持US-ASCII(如ISO 8859-x,SHIFT JIS等)字符集的编码器加以编码。有关字符集和字符编码的详细解释,请参阅HTML 4.0规范([HTML40]第5章),也可参见XML 1.0规范([XML10]2.2节和4.3.3节),以及附录F。

    如果样式表嵌套在另一个文档中,如包含在HTML的STYLE元素或"style"属性内,则该样式表和整个文档共享相同的字符编码。

    如果样式表存在于对立的文件中,用户端在确定文档的字符编码时,必须遵循如下的优先级(由高到低排列):

  1. 在"Content-Type"域中的"charset"HTTP参数。
  2. @charset@规则。
  3. 参考文档(如在HTML中,LINK元素的"charset"属性)的语言机制。

    在外部样式表中最多有一个@charset规则可以出现——它可以出现在嵌套的样式表中——它也必须出现在文档的最开始,前面没有任何字符。在"@charset"之后,用户指定字符编码的名称。名称必须是在IANA注册表(参见[IANA]。完整的字符集列表也参见[CHARSETS])中描述的字符集名。例如:

例子:

     @charset "ISO-8859-1";

    本规范并不强制用户端必须支持哪些字符编码。

    注意,依靠@charset结构在理论上存在问题,因为对于字符集如何编码没有任何先验信息。不过在实际应用中,在Internet上广泛应用的编码都基于ASCII,UTF-16,UCS-4或者(很少见)EBCDIC。这就意味着一般而言,一个文档的开始几个字节值可以让用户端可靠低检测出编码家族,从而提供足够的信息来解码@charset规则,并确定确切的字符编码。

4.4.1 字符编码中未包含的字符的引用

    样式表可能引用那些在当前字符编码中无法表示的字符。这些字符必须写成ISO 10646字符的转义引用。这些转义和在HTML或XML文档中数字字符引用的功能是一样的(参见[HTML40]第5章和第25章)。

    转义字符机制应该用在只有少数字符需要如此操作的情况下。如果文档中的大部分字符需要转义,用户应该用更合适的编码来编码文档(比方说,如果文档包含很多希腊字符,作者可以使用"ISO-8859-7"或"UTF-8")。

    如果中间处理器使用不同的字符编码,它可以将这些转义序列翻译为它所使用的编码的字节序列。另一方面,中间处理器不可以改变转义序列而取消一个ASCII字符的特殊含义。

    一致的用户端必须将它们认识的任何字符编码正确地映射到Unicode(或者它们应该表现为它们可以)。

    例如,以ISO-8859-1(Latin-1)编码的文档不可以直接包含希腊字符: "κουρος" (希腊文:"kouros")必须写为"\3BA\3BF\3C5\3C1\3BF\3C2"。

     注意:HTML 4.0中,数字字符引用的解释发生在"style"属性值中,而不在STYLE元素中。由于这一不对称性,对于"style"属性和STYLE元素,我们推荐作者使用CSS字符转义机制而不是数字字符引用。例如,我们推荐:

<SPAN style="voice-family: D\FC rst">...</SPAN>

    而不是:

<SPAN style="voice-family: D&#252;rst">...</SPAN>