程序員永遠的痛之字符編碼的奧祕

程序員永遠的痛之字符編碼的奧祕

字 符編碼相信是每個程序員的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因爲上面很多軟件都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因爲這就像一道坎一直橫在你面前,每次到這裏你都會 跌到,每次爬起來之後,你都若無其事,這樣的人被稱作戰士,真正的戰士。可惜是個力量戰士,做爲新時代的智力戰士,當然不能在那跌到然後又在這繼續跌到。

     文件的存儲方式:
     文件都有自己的存儲格式,比如最常見的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 encoding=utf-8
    set bomb
   或者使用notepad++自帶的功能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章