2016年12月26日

淺談Unicode

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

Unicode
由The Unicode Consortium制定的編碼方式
2020年3月發表Unicode 13.0

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


Unicode碼點
U+0000~U+10FFFF
其中U+hh0000~U+hhFFFF稱為第hh平面
目前一共分成0~16平面
完整儲存Unicode碼點需要4 byte

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碼點需要4 byte 
儲存字元時通常採用其他格式以降低所需空間
這些格式稱為UTF

碼元(Code Unit)
儲存一個字元需要的最小長度


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

端序:
UTF-8沒有端序的問題,不需要BOM

Win 7的記事本:檔首有BOM,可能讓某些程式無法正常解讀
Win 10的記事本、Unix-like:檔首無BOM

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


UTF-16
碼元為16 bits = 2 bytes
BMP:1個碼元
BMP以外:2個碼元,合稱為surrogate pair
 
UTF-16不是固定長度編碼
要完整表示1個Unicode字元可能需要2個碼元
Windows的wchar_t是unsigned 16-bit
也就是說1個wchat_t只是1個碼元而不是1個字元
 
每個碼元可能是:
1. BMP字元 U+0000 ~ U+D7FF, U+E000 ~ U+FFFF
2. high surrogate 0xD8XX (surrogate pair的高位部分)
3. low surrogate 0xDCXX (surrogate pair的低位部分)
 
端序
UTF-16 Little Endian
Windows kernel、Linux使用
記事本的Unicode選項

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


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