Python 編碼解碼的問題 學習筆記 總結思考

2021-08-03 13:45:28 字數 2658 閱讀 3843

*幾個問題:

1.# coding: utf-8與sys.setdefaultencoding(『utf-8』)的區別?

2.假如檔案頭 沒有#coding: utf-8那麼檔案當前的編碼是什麼?

3.print是相當於讀入麼?print出來的結果的編碼跟什麼有關?

這幾個問題會在看完以下知識後進行解答

一、基本概念:

1.位元組:

2.字元:

乙個字元就是乙個資訊單位,是各種符號和文字的統稱(例如』a』和」漢字」)

3.字符集:

某範圍內字元的集合,不同的字符集規定了字元的個數,比如ascii字符集總共有128個字元

而gb2312字符集定義了7445個字元,包含了絕大部分的漢字字元

4.字元碼:

字符集中每個字元的數字編號,例如ascii字符集用0-127連續的128個數字分別表示128個字元,例如」a」的字元碼編號是65.(字元碼形如01000001)

5.字元編碼(此處編碼為名詞概念):

將字符集中的字元碼對映為位元組流的一種具體實現方案(比如把0100000101000010劃分為01000001.01000010的方案)

字符集與字元編碼有種對應關係,例如ascii字符集對應ascii編碼

6.編碼encode、解碼decode(此處編碼為動詞概念):

通常來說:讀入檔案需要decode一下,寫入檔案需要encode一下

編碼的過程:字元->位元組流(計算機處理的是位元組流不是字元,故而編碼,是以特定的方式把字元變成位元組流)

解碼的過程:位元組流->字元()

二、字元編碼:(按演進順序)

1.ascii碼(->eascii碼)

2.(gb2312碼)gbk碼(收錄了少數民族文字) 是中國人自己創造的,解決了所有漢字的編碼問題

3.unicode編碼它為世界上每一種語言的每乙個字元定義了乙個唯一的字元碼(16進製制數字表示兩位元組或者四位元組編碼)

unicode的侷限:有時候會浪費空間; 在各個編碼規則面前作用像英語

4.utf-8它是unicode的一種實現方式,它是一種變長的字元編碼

三、python中的編碼問題

python的預設編碼是ascii碼

附:切換預設編碼的方法

所以在python2中,源**的檔案必須顯示指定編碼型別,**中出現中文就會報錯

#coding=utf-8

或者是

# -*- coding:utf-8

python2中字串相關的型別有str和unicode兩種型別

str型別的字串的編碼格式可以是ascii、utf-8、gbk等任何一種

str(採用某種編碼的字串)–decode—>unicode串

unicode串–encode—>str(採用某種編碼的字串)

在python2中預設是用ascii碼進行encode,decode操作

假如 s=』你好』

s.decode()

預設為ascii編碼進行解碼,但是ascii字符集中沒有中文符

所以應該s.decode(『utf-8』)

*回答幾個問題:

1.# coding: utf-8與sys.setdefaultencoding(『utf-8』)的區別?

# coding: utf-8是設定檔案的字元的編碼為』utf-8』,假如不這麼設定那py檔案中出現中文ide將無法識別其為什麼字元更加無法對其操作;而sys.setdefaultencoding(『utf-8』)是設定系統的預設編碼方案,即預設以』utf-8』的編碼方案讀入和寫出檔案

2.假如檔案頭 沒有#coding: utf-8那麼檔案當前的編碼是什麼?

ascii編碼方案 因為這是python直譯器預設的;

python內部使用的字串的型別為unicode型別

3.print是相當於讀入麼?print出來的結果的編碼跟什麼有關?

print 也是要將unicode串 encode 成有特定編碼的位元組流,所以與寫入操作的規則類似

假如print的物件是unicode型別即使是中文也不會出現亂碼,因為編譯器會自動對unicode型別進行編碼,

而假如指定了和原型別不同的編碼就會出現亂碼

四、檢驗編碼的工具–chardet

import chardet

chardet.detect(串)

通常只有只有str串可檢測到編碼方案

五、python3

python3 區分了 unicode str 和 byte arrary,並且預設編碼不再是 ascii, 為utf-8

import sys

sys.getdefaultencoding()

# 可檢視python3的預設編碼。​

參考:

python中的解碼 編碼問題

老話說的好 把別人教明白了,自己才算真明白 所以,文章的口吻和用語都偏介紹或是說教學式,在幫助有相同問題的同學看明白的同時,也使自己真的掌握知識點,特此說明。問題都是人類自己造成的,計算機沒有錯。我們以問題為導向,先從報錯出發。執行過程中我們會遇到各種報錯 比如 於是但是,也是有收穫的,我們發現問題...

編碼解碼問題

在很多時候我們會碰到編碼問題。例如在編寫文字檔案時,我們用到了日文和英文,在編輯器中顯示正常,是因為,記憶體中採取的是unicode編碼,相容所有字元 但是我們儲存文字檔案是確是用了gbk 只支援中文和英文 編碼儲存的,這時候就會出現儲存出錯。解決方法 存檔時,使用與編寫文字檔案相容的編碼進行儲存。...

python 編碼解碼

一種編碼想要轉成另一種編碼,需要先解碼成萬國碼 unicode,然後再從unicode轉成其他編碼。例如gbk格式想要轉成utf 8,需要先按照 gbk 的格式 decode 成 unicode,再從 unicode 格式 encode 成utf 8 python3預設使用utf 8編碼,故不用宣告...