亂碼html
主要緣由有:web
1. 文本文件的編碼與解碼程序不一致(如:瀏覽器把GBK碼的網頁當成Big5碼進行顯示)windows
2. 字體中沒有對應文字的形狀定義(表現爲使用方框來填充)api
ASCII / EASCII(1個字節)- 起源瀏覽器
下面的ASCII表中:淡藍色部分爲控制字符,淡灰色部分爲可顯示字符ide
EASCII是ASCII的擴充,新增了的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號。工具
http://www.rapidtables.com/code/text/ascii-table.htm字體
在Windows下,打開小鍵盤,按住ALT鍵,而後輸入EASCII碼[如:按住ALT鍵並依次輸入數字鍵區數字二、四、7可輸入÷]。編碼
在Vim中,在插入模式下,能夠先按Ctrl-V,再輸入表明EASCII碼的(至多三位)十進制數字。idea
ASCII/EASCII編碼被世界上任意一種字符編碼所兼容!!
GB23十二、GBK、GB18030(多字節字符集【MBCS】,最多見的MBCS實現是雙字節字符集 (DBCS))- 各自爲政
【內容】:
GB2312字符集中除經常使用簡體漢字字符外還包括希臘字母、日文平假名及片假名字母、俄語西裏爾字母等字符,共7445個字符。
GBK增長了繁體字、生僻字、漢字部首符號、豎排標點符號等內容,是GB2312編碼的超集,向下徹底兼容GB2312,兼容的含義是不只字符兼容,並且相同字符的編碼也相同。共20902個字符。
GB18030收錄了全部Unicode3.1中的字符,包括中國少數民族字符,GBK不支持的韓文字符等等,也能夠說是世界大多民族的文字符號都被收錄在內。
【特色】:
GB2312和GBK都是雙字節等寬編碼,若是算上和ASCII兼容所支持的單字節,也能夠理解爲是單字節和雙字節混合的變長編碼。
GB18030編碼是變長編碼,有單字節、雙字節和四字節三種方式。
GB18030 > GBK > GB2312,依次向下兼容。
除了GB系列的中文編碼方式外,世界各個地區也都有本身的編碼方式,例如:港澳臺地區的繁體漢字Big5編碼、日本的SJIS編碼、韓國的KSC編碼等
這些字符編碼之間不兼容,互相沖突,給全球信息交換帶來了很大的麻煩。
UNICODE - 天下歸一
標準方式:ucs2、ucs4
ucs2:用兩個字節編碼;可容納65536個字符,基本能夠包含世界全部國家的經常使用文字了。
ucs4:用四個字節編碼;可容納2147483648(21億)個字符,若是須要考慮一些偏僻字,那麼ucs4則絕對能夠知足了。
標準方式將全部字符一視同仁,會帶來浪費空間的問題,所以,人類在標準方式的基礎上,發明了uft編碼。
實現方式:utf8、utf16、utf32
utf8以字節爲單位對Unicode進行編碼,一個英文字符佔1個字節,漢字佔3個字節;
utf16以16位無符號整數爲單位對Unicode進行編碼,中文英文都佔2個字節;utf16可當作是ucs2的父集。對於兩個字節的ucs碼,utf16編碼就等於ucs碼。
英文範圍:0x0000-0x007F 中文範圍:0x4E00-0x9FBF
utf32以32位無符號整數爲單位對Unicode進行編碼,中文英文都佔4個字節。utf32可當作是ucs4的父集,目前uft32徹底等同於ucs4。
中文"漢字"的utf八、utf1六、utf32的編碼以下:
1 BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8編碼 2 WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16編碼 3 DWORD data_utf32[] = {0x00006c49, 0x00005b57}; // UTF-32編碼
小端大端(uft1六、uft32)
x86,MOS Technology 6502,Z80,VAX,PDP-11等處理器爲Little endian。注:windows系統使用的x86的處理器,所以windows爲小端序
Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等處理器爲Big endian
ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字節序是可配置的。
文本文件在起始處使用BOM(Byte Order Mark)來區分不一樣字節序的utf編碼,具體以下:
在線工具 http://tool.chinaz.com/tools/unicode.aspx
http://www.haomeili.net/Code/DetailCodes?wd=%E4%B8%AD
windows記事本:
注:ANSI - 表示使用本地系統的字符集
notepad++:
注:ANSI - 表示使用本地系統的字符集
vs2008:
vs2008工程字符集設置:
注:未設置 - 表示使用本地系統的字符集。
本地系統的字符集可用GetACP()獲取當前的codepage值來獲得,codepage值與字符集的對應表在這裏!!!
能夠在「區域和語言」面板中經過「更改系統區域設置」來修改當前的codepage值。
windows對unicode的支持:
Windows操做系統內核中的字符表示爲UTF-16小尾序,能夠正確處理、顯示以4字節存儲的字符。
可是WindowsAPI實際上僅能正確處理UCS-2字符,即僅以2字節存儲的,碼位小於U+FFFF的Unicode字符。
其根源是Microsoft C++語言把wchar_t數據類型定義爲16比特的unsigned short,
這就與一個wchar_t型變量對應一個寬字符,能夠存儲一個Unicode字符的規定相矛盾。
相反,Linux平臺的GCC編譯器規定一個wchar_t是4字節長度,能夠存儲一個UTF-32字符,寧肯浪費了很大的存儲空間。
驗證程序:
參考: