BOM
UTF-8以字節(jié)為編碼單元纬傲,沒(méi)有字節(jié)序的問(wèn)題棍掐。UTF-16以兩個(gè)字節(jié)為編碼單元楔壤,在解釋一個(gè)UTF-16文本前涯塔,首先要弄清楚每個(gè)編碼單元的字節(jié)序肌稻。例如“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59匕荸。如果我們收到UTF-16字節(jié)流“594E”爹谭,那么這是“奎”還是“乙”?
Unicode規(guī)范中推薦的標(biāo)記字節(jié)順序的方法是BOM榛搔。BOM不是“Bill Of Material”的BOM表诺凡,而是Byte Order Mark。BOM是一個(gè)有點(diǎn)小聰明的想法:
在UCS編碼中有一個(gè)叫做"ZERO WIDTH NO-BREAK SPACE"的字符践惑,它的編碼是FEFF腹泌。而FFFE在UCS中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中尔觉。UCS規(guī)范建議我們?cè)趥鬏斪止?jié)流前凉袱,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。
這樣如果接收者收到FEFF侦铜,就表明這個(gè)字節(jié)流是Big-Endian的专甩;如果收到FFFE,就表明這個(gè)字節(jié)流是Little-Endian的钉稍。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM涤躲。
UTF-8不需要BOM來(lái)表明字節(jié)順序,但可以用BOM來(lái)表明編碼方式贡未。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗(yàn)證一下)篓叶。所以如果接收者收到以EF BB BF開頭的字節(jié)流,就知道這是UTF-8編碼了羞秤。
Windows就是使用BOM來(lái)標(biāo)記文本文件的編碼方式的缸托。
文字顯示
步驟1:文字首先以某種編碼保存在文件中。
步驟2:Windows將文件中的文字編碼映射到Unicode瘾蛋。
步驟3:Windows按照Unicode在字體文件中查找字體圖像俐镐,畫到窗口上。