utf的位元組序和bom
utf-8以位元組為編碼單元,沒有位元組序的問題。utf-16以兩個位元組為編碼單元,在解釋乙個utf-16文字前,首先要弄清楚每個編碼單元的位元組序。例如收到乙個「奎」的unicode編碼是594e,「乙」的unicode編碼是4e59。如果我們收到utf-16位元組流「594e」,那麼這是「奎」還是「乙」?
unicode規範中推薦的標記位元組順序的方法是bom。bom不是「bill of material」的bom表,而是byte order mark。bom是乙個有點小聰明的想法:在ucs編碼中有乙個叫做"zero width no-break space"的字元,它的編碼是feff。而fffe在ucs中是不存在的字元,所以不應該出現在實際傳輸中。ucs規範建議我們在傳輸位元組流前,先傳輸字元"zero width no-break space"。
這樣如果接收者收到feff,就表明這個位元組流是big-endian的;如果收到fffe,就表明這個位元組流是little-endian的。因此字元"zero width no-break space"又被稱作bom。
utf-8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元"zero width no-break space"的utf-8編碼是ef bb bf。所以如果接收者收到以ef bb bf開頭的位元組流,就知道這是utf-8編碼了。
windows就是使用bom來標記文字檔案的編碼方式的。
單純的文字檔案的編碼識別﹐讀取與寫入
notepad預設有四種編碼來儲存和讀取文字檔案。分別是﹕
ansi,unicode,unicode-big-endian和utf-8。
ansi是windows作業系統在區域與語言塊設定的編碼(也就是系統預設的編碼)﹐因此像繁體作業系統就是big5,而簡體作業系統則是gbk。
而unicode和utf-8這兩種格式相信大家已經有所了解(當然前者是unicode-16)
而unicode-big-endian是什麼意思呢﹐它與unicode幾乎一樣﹐只是它把高位放在前面(而後者則剛好相反)
如同樣是字元"a"﹐在以下幾種格式中的儲存形式分別是﹕
utf-16 big-endian : 00 41
utf-16 little-endian : 41 00
utf-32 big-endian : 00 00 00 41
utf-32 little-endian : 41 00 00 00
根據bom的規則﹐因此在一段位元組流開始時﹐如果接收到以下位元組﹐則分別表明了該文字檔案的編碼。
utf-8: ef bb bf
utf-16 : ff fe
utf-16 big-endian: fe ff
utf-32 little-endian: ff fe 00 00
utf-32 big-endian: 00 00 fe ff
而如果不是以這個開頭﹐那程式則會以ansi,也就是系統預設編碼讀取。
js中 關於bom的知識
1 screentop 瀏覽器左上角到物理螢幕左上角的垂直距離 2 screenleft 瀏覽器左上角到物理螢幕左上角的水平距離 3 以上兩種 除了火狐瀏覽器不相容外,其他瀏覽器都相容,火狐瀏覽器使用screenx和screeny,其功能和上面兩種一樣 處理相容性問題 browerleft wind...
BOM知識總結
什麼是bom bom 是browser object model 瀏覽器物件模型 的縮寫,提供與瀏覽器視窗進行互動的物件。window物件是bom的核心,是最頂層的物件,所有物件都是通過它延伸出來的。全域性作用域 1.定義在全域性環境下的變數都會成為window物件的屬性。2.把變數定義在函式體裡,...
關於BOM的那些事兒
window物件 1.window物件是最頂層的物件 2.window物件有六大屬性,這六大屬性本身也是物件 3.window物件旗下的document也是物件 並且document旗下有五大屬性 4.document旗下的五大屬性又是物件,總結 都是物件 window screenleft 和 s...