程式設計師永遠的痛之字元編碼的奧秘

2021-06-22 05:28:15 字數 1427 閱讀 3564

字元編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在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++自帶的功能

程式設計師永遠的痛之字元編碼的奧秘

字 符編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 ...

程式設計師永遠的痛之字元編碼的奧秘

字 符編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 ...

程式設計師永遠的痛之字元編碼的奧秘

字 符編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 ...