Warning:
This wiki has been archived and is now read-only.
HTML5/tokenization
Tokenization
字符引用的 Tokenization
本小節定義吃掉字符引用的方法。此定義用於解析文字中的字符引用與屬性中的字符引用兩種情況。
本演算法進行的動作取決於下個字符(緊接著 U+0026 AMPERSAND 的那個):
- ↪ U+0009 CHARACTER TABULATION(tab)
- ↪ U+000A LINE FEED(LF)
- ↪ U+000C FORM FEED (FF)
- ↪ U+0020 SPACE
- ↪ U+003C LESS-THAN SIGN
- ↪ U+0026 AMPERSAND
- ↪ EOF
- ↪ 「允許的額外字符」(若有指定)
- 非字符引用。不吃掉任何字符,也不回傳任何東西。(也並非錯誤狀況)
- ↪ U+0023 NUMBER SIGN(#)
- 吃掉 U+0023 NUMBER SIGN。
再下來的動作依 U+0023 NUMBER SIGN 後面的字符而有所不同:
- U+0078 LATIN SMALL LETTER X
- U+0058 LATIN CAPITAL LETTER X
吃掉 X。
遵守下面步驟,字符範圍是 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+0066 LATIN SMALL LETTER F、U+0041 LATIN CAPITAL LETTER A 到 U+0046 LATIN CAPITAL LETTER F(也就是,0-9、A-F、a-f)。
到需要解讀數字的時候,以十六進位解讀。
- 其他字符
遵守下面步驟,字符範圍是從 U+0030 DIGIT ZERO (0) 到 U+0039 DIGIT NINE (9)。
到需要解讀數字的時候,以十進位解讀。
吃掉批配上面描述的字符範圍的所有字符。
若在範圍裡面的字符不存在,不吃掉任何字符(並吐出 U+0023 NUMBER SIGN 字符與 X 字符)。這是個解析錯誤,回傳空值。
否則,若下一個字符是 U+003B SEMICOLON,則吃掉該字符。若不是,則這是個解析錯誤。
若前面批配的字符數量是一個或更多,則將這些字符組成的字串以數字解讀(用十六進位或是十進位)。
若該數字是以下表格第一欄裡的數字其一,則這是個解析錯誤。尋找有該數字的那一行並回傳該行第二欄給出的 Unicode 字符的字符 token
數字 Unicode 字符 0x00 U+FFFD REPLACEMENT CHARACTER 0x0D U+000D CARRIAGE RETURN (CR) 0x80 U+20AC EURO SIGN (€) 0x81 U+0081 <control> 0x82 U+201A SINGLE LOW-9 QUOTATION MARK (‚) 0x83 U+0192 LATIN SMALL LETTER F WITH HOOK (ƒ) 0x84 U+201E DOUBLE LOW-9 QUOTATION MARK („) 0x85 U+2026 HORIZONTAL ELLIPSIS (…) 0x86 U+2020 DAGGER (†) 0x87 U+2021 DOUBLE DAGGER (‡) 0x88 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ) 0x89 U+2030 PER MILLE SIGN (‰) 0x8A U+0160 LATIN CAPITAL LETTER S WITH CARON (Š) 0x8B U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹) 0x8C U+0152 LATIN CAPITAL LIGATURE OE (Œ) 0x8D U+008D <control> 0x8E U+017D LATIN CAPITAL LETTER Z WITH CARON (Ž) 0x8F U+008F <control> 0x90 U+0090 <control> 0x91 U+2018 LEFT SINGLE QUOTATION MARK (‘) 0x92 U+2019 RIGHT SINGLE QUOTATION MARK (’) 0x93 U+201C LEFT DOUBLE QUOTATION MARK (“) 0x94 U+201D RIGHT DOUBLE QUOTATION MARK (”) 0x95 U+2022 BULLET (•) 0x96 U+2013 EN DASH (–) 0x97 U+2014 EM DASH (—) 0x98 U+02DC SMALL TILDE (˜) 0x99 U+2122 TRADE MARK SIGN (™) 0x9A U+0161 LATIN SMALL LETTER S WITH CARON (š) 0x9B U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›) 0x9C U+0153 LATIN SMALL LIGATURE OE (œ) 0x9D U+009D <control> 0x9E U+017E LATIN SMALL LETTER Z WITH CARON (ž) 0x9F U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ) 否則,若數字在 0xD800 到 0xDFFF 的範圍裡,或數字大於 0x10FFFF,則這是個解析錯誤。回傳 U+FFFD REPLACEMENT CHARACTER。
否則,回傳代碼點是該數字的 Unicode 字符的字符 token。若數字在 0x0001 到 0x0008、0x000E 到 0x001F、0x007F 到 0x009F、0xFDD0 到 0xFDEF 的範圍裡,或數字是 0x000B、0xFFFE、0xFFFF、0x1FFFE、0x1FFFF、0x2FFFE、0x2FFFF、0x3FFFE、0x3FFFF、0x4FFFE、0x4FFFF、0x5FFFE、0x5FFFF、0x6FFFE、0x6FFFF、0x7FFFE、0x7FFFF、0x8FFFE、0x8FFFF、0x9FFFE、0x9FFFF、0xAFFFE、0xAFFFF、0xBFFFE、0xBFFFF、0xCFFFE、0xCFFFF、0xDFFFE、0xDFFFF、0xEFFFE、0xEFFFF、0xFFFFE、0xFFFFF、0x10FFFE 或 0x10FFFF 其中之一,則這是個解析錯誤。
- U+0078 LATIN SMALL LETTER X
- ↪ 其他字符
- 吃掉最多個能批配命名字符引用表格裡第一欄任一標識符的字符(以區分大小寫的方式)。
若不能批配,則不吃掉任何字符,並回傳空值。在這種情況下,若 U+0026 AMPERSAND 字符(&)後面的字符為一個長度大於等於一的由 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+007A LATIN SMALL LETTER Z、U+0041 LATIN CAPITAL LETTER A 到 U+005A LATIN CAPITAL LETTER Z 的字符組成的串列,且後面接著 U+003B SEMICOLON 字符(;),則這是個解析錯誤。
若正被吃掉的字符引用是屬性的一部分,且批配的最後一個字符不是 U+003B SEMICOLON 字符(;),且下一個字符是 U+003D EQUALS SIGN 字符(=)或是由 U+0030 DIGIT ZERO(0)到 U+0039 DIGIT NINE(9)、U+0061 LATIN SMALL LETTER A 到 U+007A LATIN SMALL LETTER Z、U+0041 LATIN CAPITAL LETTER A 到 U+005A LATIN CAPITAL LETTER Z 其一,則由於歷史因素使用者代理必須吐出 U+0026 AMPERSAND 字符(&)後面已批配的字符,並回傳空值。
否則,成功解析字符引用。若批配的最後一個字符不是 U+003B SEMICOLON 字符(;),則這是個解析錯誤。
回傳對應字符引用名稱的一個或兩個字符 token(命名字符引用表格裡第二欄)。
若原始碼裡面(不在屬性裡)有字串I'm ¬it; I tell you
,則使用者代理會將這個字符引用當成 "not" 解析,也就是I'm ¬it; I tell you
(且這是一個解析錯誤)。但是若原始碼是I'm ∉ I tell you
,則使用者代理會將這個字符引用當成 "notin;" 解析,結果成為I'm ∉ I tell you
(且不是解析錯誤)。