2016年12月26日 星期一

淺談Unicode


這篇是我查過和Unicode相關的資料的一個簡單的整理
如果有寫錯的部分,希望各路高手能不吝指正

Unicode
由The Unicode Consortium制定的編碼方式,2016年6月發表Unicode 9.0
目前(2016年12月)一共分成0~16共17個平面
第hh個平面的碼位範圍是U+hh0000~U+hhFFFF
注意Unicode的長度不是固定2 bytes,詳情會在UTF16部份說明

Universal Character Set, UCS
ISO 10646 標準下定義的字元集,字元編碼與Unicode相同

Basic Multilingual Plane, BMP
基本多文種平面,U+0000-U+FFFF
涵蓋了大部份(但絕非全部)的常用字元
某些中文姓名會用到BMP以外的字元

Byte Order Mark, BOM (U+FEFF)
UTF-16等實作方式用來判斷位元組順序的字元
從Unicode3.2開始
U+FEFF:只能出現在位元組流的開頭,用於標識位元組序
U+2060:零寬度無斷行空白

Unicode Transformation Format, UTF
由於各種理由,字元傳輸時可能並非直接傳送其Unicode編碼
UTF是Unicode的實作方式

UTF-8 (8-bit Unicode Transformation Format)
U+0000~U+007F:ASCII,編碼後為1 byte
U+0800~U+07FF:拉丁文等字母,2 bytes
U+0800~U+FFFF:其他BMP,3 bytes
U+10000~U+1FFFFF:BMP以外,4 bytes

沒有端序的問題,實際上不需要BOM
Windows(包含記事本):檔首加入BOM,可能造成某些程式無法正常解讀
Unix-like:檔首無BOM

UTF8是網頁編碼等應用的實質標準
跨系統/跨語系的檔案建議使用UTF8(無BOM)

UTF-16
以16 bits=2 bytes為碼元(Code Unit)的編碼方式
BMP:1個碼元
BMP以外:2個碼元
注意UTF-16不是固定長度編碼
要完整表示1個UTF-16字元最多會需要2個碼元=4 bytes
由於各種原因,Windows的wchar_t是unsigned 16-bit
也就是說1個wchat_t無法完整表示BMP以外的字元

UTF-16 LE
Windows kernel、Linux使用
記事本的Unicode選項

UTF-16 BE
Mac使用
記事本的Unicode Big Endian選項

code page 950
微軟以Big-5修改而成的編碼方式
Big-5的實質標準

沒有留言:

張貼留言