檔案編碼與字元編碼

2021-05-22 13:01:08 字數 2890 閱讀 5703

首先明確一點,檔案不存在什麼編碼(歸根結底檔案都是二進位制檔案,用ue開啟可以看到都是乙個個的16進製制數),只有檔案中的字元才可以說編碼。

字元通過某種編碼組織起來存到檔案裡面,計算機通過這種編碼解析解析檔案,根據解析出來的文字繪製顯示到顯示裝置中,這樣我們就看到了文字。

最初的計算機是又8個電晶體,通過電晶體的開合與排列可以表示數種狀態,所以乙個位元組就定義為8bit,而乙個bit只能有0,1開關的表示,2的8次方是256,所以最初的計算機只能表示256種狀態。

人們定義了前32個為狀態字元比如翻頁,換行,發出(嘟)的聲音等,後來人們為了用計算機儲存文字,又把空格,英文本母,數字等加進了進來,總共使用了127個,這時候大家把這個儲存方案叫做ansi的ascii編碼 [american standard code for information interchange,美國資訊互換標準**](http://www.dreamdu.com/xhtml/ascii/),這個表儲存英文已經沒有 問題了,但是127個裡並不包含其它歐洲國際的文字,人們又繼續擴充套件ascii表的內容,加入了一些字元,與一些畫**的符號,直接擴充套件到255個。

國人發現只使用ascii表根本無法表示漢字!怎麼辦?沒有什麼能難道我們!於是我們發明了gb2312編碼,此編碼完全忽略了ascii表中 127位後面的內容,127位前面的內容保留,如果兩個位元組同時大於127(7f)就認為這兩個位元組表示乙個漢字,同時像標點、字母也都重新使用兩個位元組 定義了一遍,這就是我們經常說的 全形,這種方案可以表示6000種文字。

但是中國的文字太複雜6000個字也不夠用,人們開始擴充套件gb2312,規定只要乙個位元組大於127,這個位元組和後面的位元組組合起來就代表乙個漢字,這種編碼成為gbk,於是又增加了20000多個漢字!

現在明白meta 的編碼資訊 裡為什麼有gb2312與gbk了吧?:)

這樣很多國家都開始定義自己的編碼了,日本,南韓等。甚至連中國的台灣省都定義了一種編碼 big5。所以在當時乙個程式要想適應多國語言簡直要把人鬱悶死。

如果搞過windows程式設計的人應該知道,win裡面有多位元組字符集mbcs(multi-byte character set)的說法,而且mbcs包含兩種字元型別,單位元組字元sbcs(single-byte characters set)和雙位元組字元(double-byte characters set)dbcs。我們的gbk與gb2312都是dbcs。所以我們在程式設計時經常遇到乙個中文字元等於兩個英文本元的事情。big5與日本南韓的編碼也 都屬於dbcs。

這下清楚了吧,根本沒什麼ansi檔案或gb2312檔案,檔案開啟時會根據作業系統的編碼方式(就是安裝在作業系統中的編碼解析方式)來嘗試開啟檔案,如果安裝了中文編碼,就把ansi檔案當作中文開啟,如果日文編碼,就當作日文開啟。

iso最後提出了unicode(universal multiple-octet coded character set,簡稱 ucs)編碼來解決所有的問題。

unicode編碼方式規定使用兩個位元組(16位)表示表示乙個字元,算算2的16次方是多少?原來ansi規定的都擴充為2位元組,並且把所有已知的語言都編碼進unicode。unicode可以表示65536個字元。

這下多國語言程式開始高興了,使用unicode全部搞定!於是微軟重現編輯windows核心,完全使用unicode編碼,搞過win程式設計的人應該都知道,以a或w結尾的函式,還有靈巧的_t巨集吧?

雖然unicode有很多優點,但是缺點也不少,我先總結我知道的兩點:

1,狂佔空間,以前乙個位元組可以表示,現在卻要用兩個位元組了,網路上有80%屬於英文本元,這下網路幾乎要擴大一倍!

所以又有人研究出來了utf-8(unicode translation format - 8)編碼,unicode轉換格式,對於常用字元使用單位元組,漢字等使用雙位元組。8代表每次在網路上傳輸8位,如果是utf-16就是每次傳輸16位。搞 過網路程式設計的朋友應該知道,位元組序(就是位元組的排放順序)分為兩種,主機位元組序與網路位元組序,就是大頭(俗稱)在前,小頭在前的問題,在網路上面傳輸的流 的位元組序很可能是不一致的,於是需要使用一種方法通知接收端,傳輸流的位元組序。有人發明了一種簡單的方法,在每個流的開始加上ffef或efff,分別主 機與網路位元組序,我們可以使用記事本儲存乙個unicode檔案,再使用ue開啟看看(hex方式開啟)。所以有時候網頁傳到網上,在網頁最開始的地方會 出現乙個字元,這個有時候很令人費解。

用記事本新建立兩個檔案存為unicode與unicode big endian模式,輸入夢之都,儲存再用ue開啟。

unicode

ff fe a6 68 4b 4e fd 90

unicode big endian

fe ff 68 a6 4e 4b 90 fd (觀察,沒兩個位元組和上面的對比)

2,unicode與gbk等兩位元組編碼完全不相容,無法找到一種簡單的方式轉換(只能使用查詢表的方式)

這點我們可以使用記事本新建立兩個檔案乙個ansi的檔案,另乙個utf8的檔案,分別寫入夢之都 ,儲存。使用ue的hex模式開啟我們會看到。

unicode

ff fe a6 68 4b 4e fd 90

ansi

c3 ce d6 ae b6 bc

猜編碼在windows系統中開啟檔案時,是使用了猜的方式選擇解析檔案內容編碼系統,如果檔案開頭使用了feff或fffe,win系統認為 unicode編碼,否則為ansi編碼,如果是ansi編碼繼續分析,如果乙個位元組大於127,就證明這個位元組與後面的位元組組成了乙個漢字。

所以windows中文系統下,如果ansi檔案,那麼就會用gb2312方式轉換,如果是日文系統,就會使用日文方式轉變,但是絕對不能說ansi檔案裡面有中文字元就是gb2312!乙個gb2312占用兩個位元組。而utf8 win系統在前面加了幾個位元組以示區別。

Python 字元編碼與檔案處理

目前計算機記憶體的字元編碼都是unicode,目前國內的windows作業系統採用的是gbk。python2預設的字元編碼方式是ascii python3預設的字元編碼方式是unicode py檔案頭部的 coding utf 8是幫助python識別.py檔案的編碼方式,故在寫.py檔案時要注意檔...

python 字元編碼與檔案處理

字元編碼 計算機工作就要通電,也就是說 電 驅使計算機幹活,而電只有高電壓 二進位制1 低電壓 二進位制0 也就是說計算機只認數字。程式設計的目的就是讓計算機幹活,程式設計的結果就是一堆字元,也就是我們程式設計最終實現的是 一堆字元驅動計算機幹活呢。1 python直譯器是執行檔案內容的,因而pyt...

字元編碼和檔案

儲備知識點 1.計算機系統分為三層 應用程式 作業系統 計算機硬體 2.執行python程式的三個步驟 1.先啟動python直譯器 2.再將python檔案當作普通的文字檔案讀入記憶體 3.解釋執行讀入記憶體的 開始識別語法 字元編碼 1.什麼是字元編碼 字元編碼表 人類的字元 數字 1bytes...