ANSI、UTF-8蔫劣、Unicode為字符代碼的三種編碼格式坪郭,一個字符可以被編碼成ANSI、UTF-8或Unicode格式脉幢,這三種格式只是表現(xiàn)形式不一樣歪沃,其表示內(nèi)容是一樣的。
ANSI嫌松、UTF-8沪曙、Unicode
ANSI、UTF-8萎羔、Unicode為字符代碼的三種編碼格式液走,一個字符可以被編碼成ANSI、UT-F8或Unicode格式,這三種格式只是表現(xiàn)形式不一樣缘眶,其表示內(nèi)容是一樣的嘱根。如下表:
char | ANSI(GBK) | Unicode | UTF-8 |
---|---|---|---|
中 | 0xD6D0 | 0x4E2D | 0xE4B8AD |
ANSI編碼
ANSI表示英文字符時用一個字節(jié),表示中文用兩個字節(jié)
為了使計算機(jī)支持多種語言巷懈,不同的國家和地區(qū)制定了不同的標(biāo)準(zhǔn)该抒,由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn)。這些使用 2 個字節(jié)來代表一個字符的各種漢字延伸編碼方式顶燕,稱為 ANSI 編碼凑保。在簡體中文系統(tǒng)下,ANSI 編碼代表 GB2312 編碼涌攻,在日文操作系統(tǒng)下欧引,ANSI 編碼代表 JIS 編碼。
對于ANSI編碼而言癣漆,0x00~0x7F
之間的字符维咸,依舊是1個字節(jié)代表一個字符(ASCII編碼),而這之外的字符通常是使用0x80~0xFF
范圍內(nèi)的兩個字節(jié)來表示一個字符。比如漢字找那個的'中'在簡體中文中使用[0xD6, 0xD0]
這兩個字節(jié)存儲梁剔。
下表中展示了文在不同ANSI標(biāo)準(zhǔn)下的編碼:
char | ANSI(GBK) | ANSI(Big5) | ANSI(JIS) | Unicode | UTF-8 |
---|---|---|---|---|---|
文 | 0xCEC4 | 0xA4E5 | 0x95B6 | 0x6587 | 0xE69687 |
可以看出髓帽,不同ANSI編碼之間互不兼容,當(dāng)信息在國際間交流時租副,無法將屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中较性。需要將不同的ANSI編碼都轉(zhuǎn)換成UTF-8編碼用僧,進(jìn)而存儲。
Unicode編碼
Unicode字符集編碼全稱:Universal Multiple-Octet Coded Character Set赞咙,通用多八位編碼字符集责循。Unicode字符集是國際組織制定的可以容納世界上所有文字和符號的編碼方案。
Unicode編碼使用兩個字節(jié)(0x0000-0xFFFF
)來表示一個字符攀操,世界上任何文字和符號都對應(yīng)于Unicode字符集中的一個二進(jìn)制代碼院仿,但是:
Unicode只是一個符號集, 它只規(guī)定了符號的二進(jìn)制代碼, 卻沒有規(guī)定這個二進(jìn)制代碼應(yīng)該如何存儲。
Unicode編碼的優(yōu)點(diǎn)是覆蓋了世界上所有的文字和符號速和,缺陷則是對于英文字符浪費(fèi)了一個字節(jié)歹垫。例如:英文A在unicode中表示為0x0041。
UTF-8編碼
UTF-8是Unicode的實現(xiàn)方式之一颠放。
UTF-8全稱:8bit Unicode Transformation Format排惨,8比特Unicode通用轉(zhuǎn)換格式。UTF-8是一種針對Unicode的可變長度字符編碼碰凶∧喊牛可以表示Unicode標(biāo)準(zhǔn)中的任何一個字符鹿驼,且其編碼中的第一個字節(jié)仍然與ASCII兼容。
UTF-8是一種變長的編碼方式谴麦,可以使用1~6個字節(jié)對Unicode字符集進(jìn)行編碼蠢沿,編碼規(guī)則如下:
對于單字節(jié)的符號, 字節(jié)的第一位設(shè)為0, 后面7位為這個符號的unicode碼. 因此對于
英語字母, UTF-8編碼和ASCII碼是相同的.對于n字節(jié)的符號(n>1), 第一個字節(jié)的前n位都設(shè)為1, 第n+1位設(shè)為0, 后面字節(jié)的前
兩位一律設(shè)為10. 剩下的沒有提及的二進(jìn)制位, 全部為這個符號的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編碼中,英文字符占一個字節(jié)匾效,中文字符占用3個字節(jié)舷蟀。
總結(jié)
1、中文操作系統(tǒng)默認(rèn)ansi編碼面哼,生成的txt文件默認(rèn)為ansi編碼野宜。
2、國際文檔(txt和xml)使用unicode編碼是正宗做法魔策;操作系統(tǒng)和瀏覽器都能夠“理解”unicode編碼匈子。瀏覽器“迫于壓力”才“理解”utf-8編碼。但是闯袒,操作系統(tǒng)有時只認(rèn)unicode編碼虎敦。
3、Windows記事本有四個編碼選項:ANSI政敢、Unicode其徙、Unicode Big Endian和UTF-8。
- ANSI是默認(rèn)的編碼方式喷户。對于英文文件是ASCII編碼唾那,對于簡體中文文件是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會采用Big5碼)褪尝。
- Unicode編碼指的是UCS-2編碼方式闹获,即直接用兩個字節(jié)存入字符的Unicode碼。這個選項用的little endian格式河哑。
- Unicode big endian編碼與上一個選項相對應(yīng)避诽。采用big endian格式。
- UTF-8指帶BOM 的UTF-8璃谨。
ANSI茎用、UTF-8、Unicode轉(zhuǎn)換
Windows Unicode and Character Sets
Unicode編碼字符集是最通用的字符編碼標(biāo)準(zhǔn)睬罗,Windows應(yīng)用程序使用Unicode字符集的UTF-16實現(xiàn)版本。同時旭斥,Windows也支持傳統(tǒng)的字符集:單字節(jié)字符集(Single-byte character sets, SBCS)和多字節(jié)字符集(Multibyte character sets)容达。
很多Windows API函數(shù)擁有“A”和“W”版本,“A”版本基于Windows Code Page垂券,而“W”版本則基于Unicode字符花盐。應(yīng)用程序可以通過WideCharToMultiByte和MultiByteToWideChar兩個函數(shù)來轉(zhuǎn)換Unicode字符串和基于Windows Code Page字符串羡滑。雖然函數(shù)名中含有“MultiByte”,這些函數(shù)實際上能處理SBCS算芯、DBCS和multibyte character set Code page柒昏。
編碼轉(zhuǎn)換
在Windows平臺下,ANSI熙揍、UTF-8职祷、Unicode三者之間的轉(zhuǎn)換主要依賴于WideCharToMultiByte和MultiByteToWideChar兩個函數(shù)。
- Unicode轉(zhuǎn)UFT-8:設(shè)置
WideCharToMultiByte
的CodePage參數(shù)為CP_UTF8届囚; - UTF-8轉(zhuǎn)Unicode:設(shè)置
MultiByteToWideChar
的CodePage參數(shù)為CP_UTF8 - Unicode轉(zhuǎn)ANSI:設(shè)置
WideCharToMultiByte
的CodePage參數(shù)為CP_ACP有梆; - ANSI轉(zhuǎn)Unicode:設(shè)置
MultiByteToWideChar
的CodePage參數(shù)為CP_ACP; - UTF-8轉(zhuǎn)ANSI:先將UTF-8轉(zhuǎn)換為Unicode意系,再將Unicode轉(zhuǎn)換成ANSI泥耀;
- ANSI轉(zhuǎn)UTF-8:先將ANSI轉(zhuǎn)換為Unciode,再將Unicode轉(zhuǎn)換成ANSI蛔添。
注
本文內(nèi)容應(yīng)該存在錯誤或者是以偏概全的問題痰催,后續(xù)會繼續(xù)深入了解。