檔案的存儲方式:
檔案都有自己的存儲格式,比如最常見的txt,cpp,h,c,xml ,png, rmvb各種格式,還有自定義格式。這些檔案不論是什麼格式,都是存儲在計算機硬碟裡的2進制格存儲,對應不同檔案格式,有不同的軟體解析。這篇文章不談 檔案是如何存儲的,隻談檔案是如何解析的。
文本檔案解析:
文本檔案對應于人類可以閱讀的文本,如何從2進制轉換為文本檔案呢?起初由于計算機在美國發明,自然大家考慮的是英語如何表示,英語字母總共26個,加 上特殊字元,128個字元,7位既一個byte即可表示出來。這個就是大家所熟知的ascill編碼。對應關系很簡單,一個字元對應一一個byte。
但很快發現,其他非英語國家的文字遠遠超過ascill碼,這時候大家當然想統一字元編碼,不同國家出了自己不同的編碼方式,中國的gb2312就是自 己做出來的編碼方式,這樣下去每個國家都有自己的編碼方式,來回轉換太麻煩了。這時候出現了新的編碼方式,unicode編碼方式,想将編碼統一,是以規 定了每個字元對應的unicode碼。
1、很多檔案都是ascii編碼,如果用unicode 太浪費。
2、沒有标志位說明該幾個位元組來解析為一個符号。
這時候拯救世界的utf出現了,utf是unicode的一種實作,隻不過更聰明了。utf16是占用兩位元組,或者四位元組,utf32是占用四位元組。utf8是很聰明的一種表示方式。
1、對于單位元組符号,位元組第一位為0,後面7位表示位元組編碼。
2、對于n位元組符号,第一位元組的前n位都設為1,第n+1位為0,其餘位為編碼位置。
對于不同的編碼,在文本的最前方有不同的标志,unicode 通常有兩位來表示分别是ff fe, 或者feff, fffe表示big-endian 編碼feff表示litte-endian編碼。utf8是efbbbf來開頭的。可以看出來utf-8是自解釋的,是以不用帶這個标志檔案,大多數程式 是可以識别的。但有些程式不能識别這個标志,比如php就會直接把這個标志當文本解析,不會忽略。相信很多遇到php輸出文本解析亂碼或者解析錯誤的同學 都遇到這樣的問題。
如何解決問題:
如果有vim那最好不過了,去掉指令:
set encoding=utf-8
set nobomb
添加指令:
set bomb
或者使用notepad++自帶的功能