1. ASCII在計算機裡,一切都是用二進位制儲存的,比如 a 這個字母,在計算機裡,用 0110 0001 這個8個bit來表示,8個bit就是一個位元組。所謂ascii,就是一個字元編碼,它規定了英文中的各種字元在計算機裡表示形式。 ascii碼作為一種字元編碼,可以表示128個字元與二進位制之間的關係,字元a的二進位制編碼是“0110 0001”,把這個二進位制轉成10進位制就是97,下面的程式碼可以處理這種關係的轉換
1. ASCII在計算機裡,一切都是用二進位制儲存的,比如 a 這個字母,在計算機裡,用 0110 0001 這個8個bit來表示,8個bit就是一個位元組。所謂ascii,就是一個字元編碼,它規定了英文中的各種字元在計算機裡表示形式。 ascii碼作為一種字元編碼,可以表示128個字元與二進位制之間的關係,字元a的二進位制編碼是“0110 0001”,把這個二進位制轉成10進位制就是97,下面的程式碼可以處理這種關係的轉換
輸出結果 2. unicode 2.1 大一統 只要稍微一思考,就會發現一個嚴重的問題,ascii碼只是對英文的字元進行編碼,可是這個世界上的語言文字又不僅僅只有英文,我們常用的漢字就有幾千個,可ascii碼只能對128個字元進行編碼,這讓我們華人咋辦 於是乎,我們華人就搞出了GB2312,GBK這兩個字符集,ascii用一個位元組進行編碼,我們漢字太多,因此我們用多個位元組進行編碼。 華人搞一套,法華人搞一套,俄羅斯人又搞了一套,漸漸的,就亂套了。 乾脆,搞一個大點的字符集,把這個世界上所有的字元都進行編碼,然後大家就用這套編碼來處理文字,這就是unicode字符集。 2.2 大一統的問題 unicode只是一個字符集,它規定了不同的字元在二進位制上的表示形式,比如“升”這個漢字,它的unicode編碼是 \u5347,5347是16進位制,轉換成成10進位制是21319,轉成二進位制是101 0011 0100 0111,這一個漢字,至少需要2個位元組來表示。 下面的程式碼,演示了獲取一個漢字的編碼內容 程式執行結果 unicode並沒有規定這些字元所對應的二進位制程式碼,但是並沒有規定這些二進位制程式碼該如何儲存。這個漢字兩個位元組就能儲存,但有些字元需要三個位元組,像a這種字元,以前大家用ascii碼的時候,用一個位元組就能表示,在unicode裡如果用兩個或者更多位元組表示,那麼不是很浪費麼,而且也與之前的ascii不相容。 3 utf-8utf-8解決了unicode的編碼問題,它是一種變長的編碼方式,ascii碼錶裡的字元仍然用一個位元組來儲存,一個漢字用三個位元組來儲存 程式執行結果 4 python3裡的unicode 在python3中,字串是以unicode編碼的,當你想把一個字串寫入到磁碟上時,就必須指定用哪種編碼方式進行儲存,否則,就容易出錯,比如下面的這段程式碼 報的錯誤是 有了前面的內容做鋪墊,你大概可以知道究竟發生了什麼錯誤。 字串採用的是unicode字符集,但是檔案儲存的時候,預設採用ascii編碼,這就有問題了,ascii可以表示的範圍太有限了,只有128個字元,可是漢字的unicode編碼裡很容就出現大於128的位元組,這就是錯誤發生的原因,解決這個問題,可以採取下面兩種方法 4.1 指定utf-8編碼 4.2 以二進位制的形式寫入檔案 這種方法雖然也行,但並不常用,因為這需要每次寫入都對字串進行utf-8編碼,不如第一種方法簡單高效