utf-16轉換至utf-8相關知識及golang實現總結
BOM(Byte Order Mark)既位元組序標記,一般是出現在以Unicode編碼的檔案開始的頭部。帶BOM的Unicode編碼檔案檢視其二進位制編碼會出現以下資料,下面只是一些常用的字元編碼
字元編碼 | Bom (十六進位制) |
---|---|
UTF-8 | EF BB BF |
UTF-16 (BE) 大端序 | FE FF |
UTF-16 (LE) 小端序 | FF FE |
UTF-32 (BE) 大端序 | 00 00 FE FF |
UTF-32 (LE) 小端序 | FF FE 00 00 |
GB-18030 | 84 31 95 33 |
Unicode編碼簡介
-
Unicode是容納世界所有文字元號的國際標準編碼,使用四個位元組為每個字元編碼。
-
UTF是英文 Unicode Transformation Format 的縮寫,意為把 Unicode 字元轉換為某種格式。UTF 系列編碼方案(UTF-8、UTF-16、UTF-32)均是由 Unicode 編碼方案衍變而來,以適應不同的資料儲存或傳遞,它們都可以完全表示 Unicode 標準中的所有字元。目前,這些衍變方案中 UTF-8 被廣泛使用,而 UTF-16 和 UTF-32 則很少被使用。
-
UTF-8使用一至四個位元組為每個字元編碼,其中大部分漢字採用三個位元組編碼,少量不常用漢字採用四個位元組編碼。因為 UTF-8 是可變長度的編碼方式,相對於 Unicode 編碼可以減少儲存佔用的空間,所以被廣泛使用。
-
UTF-16使用二或四個位元組為每個字元編碼,其中大部分漢字採用兩個位元組編碼,少量不常用漢字採用四個位元組編碼。UTF-16 編碼有大端序和小端序之別,即 UTF-16BE 和 UTF-16LE,在編碼前會放置一個 U+FEFF 或 U+FFFE(UTF-16BE 以 FEFF 代表,UTF-16LE 以 FFFE 代表),其中 U+FEFF 字元在 Unicode 中代表的意義是 ZERO WIDTH NO-BREAK SPACE,顧名思義,它是個沒有寬度也沒有斷字的空白。
-
UTF-32使用四個位元組為每個字元編碼,使得 UTF-32 佔用空間通常會是其它編碼的二到四倍。UTF-32 與 UTF-16 一樣有大端序和小端序之別,編碼前會放置 U+0000FEFF 或 U+0000FFFE 以區分。
大端序和小端序
- 大端:大端就是記憶體中的低位地址存放對應整數的高位。
- 小端:小端就是記憶體中的低位地址存放對應整數的低位。
位元組陣列:[0 1 2] 按照大端序轉換成二進位制為: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 1 0 按照小端序轉換成二進位制為: 0 0 0 0 0 0 1 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 所以位元組陣列[0 1 2]大端序十進位制為:258,小端序為:131328 複製程式碼
golang中的轉換實現參考binary
包
golang 轉換utf-16編碼至utf-8
utf-16 在做轉換時不能忽視該編碼的大端序和小端序區別,不然將會導致亂碼,轉換使用到包golang.org/x/text/encoding/unicode
,
bs := [8]byte{93, 78, 95, 134, 75, 144, 26, 144} decoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder() bs2, err := decoder.Bytes(bs[:]) fmt.Println(string(bs2), err) 複製程式碼
output...
九號運通 <nil> 複製程式碼
unicode.LittleEndian
指定為小端序
unicode.IgnoreBOM
忽略BOM標記
參考連結: