Warning:
This wiki has been archived and is now read-only.

HTML5/tokenization

From HTML5 Chinese Interest Group Wiki
Jump to: navigation, search

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 字符
0x00U+FFFDREPLACEMENT CHARACTER
0x0DU+000DCARRIAGE RETURN (CR)
0x80U+20ACEURO SIGN (€)
0x81U+0081<control>
0x82U+201ASINGLE LOW-9 QUOTATION MARK (‚)
0x83U+0192LATIN SMALL LETTER F WITH HOOK (ƒ)
0x84U+201EDOUBLE LOW-9 QUOTATION MARK („)
0x85U+2026HORIZONTAL ELLIPSIS (…)
0x86U+2020DAGGER (†)
0x87U+2021DOUBLE DAGGER (‡)
0x88U+02C6MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ)
0x89U+2030PER MILLE SIGN (‰)
0x8AU+0160LATIN CAPITAL LETTER S WITH CARON (Š)
0x8BU+2039SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹)
0x8CU+0152LATIN CAPITAL LIGATURE OE (Œ)
0x8DU+008D<control>
0x8EU+017DLATIN CAPITAL LETTER Z WITH CARON (Ž)
0x8FU+008F<control>
0x90U+0090<control>
0x91U+2018LEFT SINGLE QUOTATION MARK (‘)
0x92U+2019RIGHT SINGLE QUOTATION MARK (’)
0x93U+201CLEFT DOUBLE QUOTATION MARK (“)
0x94U+201DRIGHT DOUBLE QUOTATION MARK (”)
0x95U+2022BULLET (•)
0x96U+2013EN DASH (–)
0x97U+2014EM DASH (—)
0x98U+02DCSMALL TILDE (˜)
0x99U+2122TRADE MARK SIGN (™)
0x9AU+0161LATIN SMALL LETTER S WITH CARON (š)
0x9BU+203ASINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›)
0x9CU+0153LATIN SMALL LIGATURE OE (œ)
0x9DU+009D<control>
0x9EU+017ELATIN SMALL LETTER Z WITH CARON (ž)
0x9FU+0178LATIN 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+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 &notit; I tell you,則使用者代理會將這個字符引用當成 "not" 解析,也就是 I'm ¬it; I tell you(且這是一個解析錯誤)。但是若原始碼是 I'm ∉ I tell you,則使用者代理會將這個字符引用當成 "notin;" 解析,結果成為 I'm ∉ I tell you(且不是解析錯誤)。