注:轉載自“小熊猜猜我有幾顆糖” https://www.jianshu.com/p/c23f3ea5443d,只爲學習備份。十分感謝。
ANSI、UTF-8、Unicode爲字符代碼的三種編碼格式,一個字符可以被編碼成ANSI、UTF-8或Unicode格式,這三種格式只是表現形式不一樣,其表示內容是一樣的。
ANSI、UTF-8、Unicode
ANSI、UTF-8、Unicode爲字符代碼的三種編碼格式,一個字符可以被編碼成ANSI、UT-F8或Unicode格式,這三種格式只是表現形式不一樣,其表示內容是一樣的。如下表:
char | ANSI(GBK) | Unicode | UTF-8 |
---|---|---|---|
中 | 0xD6D0 | 0x4E2D | 0xE4B8AD |
ANSI編碼
ANSI表示英文字符時用一個字節,表示中文用兩個字節
爲了使計算機支持多種語言,不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個字節來代表一個字符的各種漢字延伸編碼方式,稱爲 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼。
對於ANSI編碼而言,0x00~0x7F
之間的字符,依舊是1個字節代表一個字符(ASCII編碼),而這之外的字符通常是使用0x80~0xFF
範圍內的兩個字節來表示一個字符。比如漢字找那個的'中'在簡體中文中使用[0xD6, 0xD0]
這兩個字節存儲。
下表中展示了文在不同ANSI標準下的編碼:
char | ANSI(GBK) | ANSI(Big5) | ANSI(JIS) | Unicode | UTF-8 |
---|---|---|---|---|---|
文 | 0xCEC4 | 0xA4E5 | 0x95B6 | 0x6587 | 0xE69687 |
可以看出,不同ANSI編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。需要將不同的ANSI編碼都轉換成UTF-8編碼,進而存儲。
Unicode編碼
Unicode字符集編碼全稱:Universal Multiple-Octet Coded Character Set,通用多八位編碼字符集。Unicode字符集是國際組織制定的可以容納世界上所有文字和符號的編碼方案。
Unicode編碼使用兩個字節(0x0000-0xFFFF
)來表示一個字符,世界上任何文字和符號都對應於Unicode字符集中的一個二進制代碼,但是:
Unicode只是一個符號集, 它只規定了符號的二進制代碼, 卻沒有規定這個二進制代碼應該如何存儲。
Unicode編碼的優點是覆蓋了世界上所有的文字和符號,缺陷則是對於英文字符浪費了一個字節。例如:英文A在unicode中表示爲0x0041。
UTF-8編碼
UTF-8是Unicode的實現方式之一。
UTF-8全稱:8bit Unicode Transformation Format,8比特Unicode通用轉換格式。UTF-8是一種針對Unicode的可變長度字符編碼。可以表示Unicode標準中的任何一個字符,且其編碼中的第一個字節仍然與ASCII兼容。
UTF-8是一種變長的編碼方式,可以使用1~6個字節對Unicode字符集進行編碼,編碼規則如下:
-
對於單字節的符號, 字節的第一位設爲0, 後面7位爲這個符號的unicode碼. 因此對於
英語字母, UTF-8編碼和ASCII碼是相同的. -
對於n字節的符號(n>1), 第一個字節的前n位都設爲1, 第n+1位設爲0, 後面字節的前
兩位一律設爲10. 剩下的沒有提及的二進制位, 全部爲這個符號的unicode碼.
n | Unicode符號範圍 | UTF-8編碼方式 |
---|---|---|
1 | 0000 0000 - 0000 007F | 0xxxxxxx |
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
注:在UTF-8編碼中,英文字符佔一個字節,中文字符佔用3個字節。
總結
1、中文操作系統默認ansi編碼,生成的txt文件默認爲ansi編碼。
2、國際文檔(txt和xml)使用unicode編碼是正宗做法;操作系統和瀏覽器都能夠“理解”unicode編碼。瀏覽器“迫於壓力”才“理解”utf-8編碼。但是,操作系統有時只認unicode編碼。
3、Windows記事本有四個編碼選項:ANSI、Unicode、Unicode Big Endian和UTF-8。
- ANSI是默認的編碼方式。對於英文文件是ASCII編碼,對於簡體中文文件是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會採用Big5碼)。
- Unicode編碼指的是UCS-2編碼方式,即直接用兩個字節存入字符的Unicode碼。這個選項用的little endian格式。
- Unicode big endian編碼與上一個選項相對應。採用big endian格式。
- UTF-8指帶BOM 的UTF-8。
ANSI、UTF-8、Unicode轉換
Windows Unicode and Character Sets
Unicode編碼字符集是最通用的字符編碼標準,Windows應用程序使用Unicode字符集的UTF-16實現版本。同時,Windows也支持傳統的字符集:單字節字符集(Single-byte character sets, SBCS)和多字節字符集(Multibyte character sets)。
很多Windows API函數擁有“A”和“W”版本,“A”版本基於Windows Code Page,而“W”版本則基於Unicode字符。應用程序可以通過WideCharToMultiByte和MultiByteToWideChar兩個函數來轉換Unicode字符串和基於Windows Code Page字符串。雖然函數名中含有“MultiByte”,這些函數實際上能處理SBCS、DBCS和multibyte character set Code page。
編碼轉換
在Windows平臺下,ANSI、UTF-8、Unicode三者之間的轉換主要依賴於WideCharToMultiByte和MultiByteToWideChar兩個函數。
- Unicode轉UFT-8:設置
WideCharToMultiByte
的CodePage參數爲CP_UTF8; - UTF-8轉Unicode:設置
MultiByteToWideChar
的CodePage參數爲CP_UTF8 - Unicode轉ANSI:設置
WideCharToMultiByte
的CodePage參數爲CP_ACP; - ANSI轉Unicode:設置
MultiByteToWideChar
的CodePage參數爲CP_ACP; - UTF-8轉ANSI:先將UTF-8轉換爲Unicode,再將Unicode轉換成ANSI;
- ANSI轉UTF-8:先將ANSI轉換爲Unciode,再將Unicode轉換成ANSI。
作者:小熊猜猜我有幾顆糖
鏈接:https://www.jianshu.com/p/c23f3ea5443d
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。