天天看點

python中解決中文亂碼什麼是字元編碼python 的字元編碼解決中文編碼問題

解決中文亂碼

  • 什麼是字元編碼
  • python 的字元編碼
    • encode和decode
      • unicode還可以decode嗎?
      • UTF-8還可以encode嗎?
  • 解決中文編碼問題
    • 問題1:使用requests擷取網站内容後,出現中文亂碼
    • 問題2:非法字元抛出異常
    • 問題3:網頁可能使用了gzip壓縮
    • 問題4:讀取檔案的中文亂碼

什麼是字元編碼

總的來說,字元串的編碼都隻有兩大類:

  1. 通用的

    Unicode

    編碼。
  2. Unicode

    轉化成的某種類型的編碼。如

    UTF-8

    GBH

    等。

Unicode 被稱為統一碼、萬國碼或單一碼。它為每種語言中的每個字元設定了統一的并且唯一的二進制編碼。

為了節省空間,開發了一些中間格式的字元集。被稱為通用轉換格式UnicodeTransformation Format(UTF),常見的有 UTF−8 和 UTF−16。

随着網際網路的普及,強烈要求出現一種統一的編碼方式, UTF−8 就是在互聯

網上使用最廣的一種Unicode的實作方式。 UTF−8 最大的一個特點是長度可變,它可以使用1一4個位元組表示一個符号,英文字母通常被編為1個位元組,漢字通常。被編為3個位元組,如表 所示。

字元 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
01001110 00101101 11100100 10111000 10101101

對于 UTF−8 編碼,怎麼知道什麼時候是1個位元組,什麼時候是3個位元組呢?

其實, UTF−8 的編碼規則很簡單,隻有兩條:

  1. (1)對于單位元組的符号,位元組的第1位設為0,後面7位為這個符号的

    Unicode碼。是以對于英語字母。 UTF−8 編碼和ASCII碼是相同的。

  2. 對于n位元組的符号 (n>1),第1個位元組的前n位都設為1,第 n+1 位設為0,後面位元組的前兩位一律設為10,剩下的沒有提及的二進制位全部為這個符号的Unicode碼。例如,上述字元A為單位元組符号,其 UTF−8 編碼位元組的第1位是0。而漢字“中”為3個位元組符号,第1個位元組的前3位都設為1,第1個位元組的第4位為。

python 的字元編碼

再python中字元的編碼使用

str

bytes

編碼兩種類型。

  1. str字元串:使用

    Unicode

    編碼。
  2. bytes字元串:使用将

    Unicode

    轉化成的某種類型的編碼,如

    UTF-8

    python3預設字元型編碼為Unicode,但python2則不是。

encode和decode

  • encode

    作用是将

    Unicode

    轉化成的某種類型的編碼。
  • decode

    作用是将其他編碼的字元串轉換成

    Unicode

    編碼。
    python中解決中文亂碼什麼是字元編碼python 的字元編碼解決中文編碼問題

unicode還可以decode嗎?

腦洞大開呀,答案是不可以的,unicode不可以再被解碼。

UTF-8還可以encode嗎?

答案是不可以直接解碼,可以節間。就是要先将UTF-8轉成Unicode,再進行encode

解決中文編碼問題

問題1:使用requests擷取網站内容後,出現中文亂碼

r = requests.get(url)

可以先用

r.encoding

檢視其對應的編碼格式,如果是

gb2312

就加上

r.encode ='gb2312'

問題2:非法字元抛出異常

當我們将某個字元串從GBK解碼為Unicode時,可以用

如果報錯可以是一個頁面中有多中編碼,于是出現了非法字元。

可以使用

ignore

忽略掉

問題3:網頁可能使用了gzip壓縮

解決方法是:使用

r.content

會自動解碼

gzip

deflate

r = requests.get(url)
after_gzip = r.content
print(after_gzip.decode('UTF-8')
           

問題4:讀取檔案的中文亂碼

我們必須在讀取檔案的時候聲明編碼格式。如

result_utf8 = open('test_utf8.txt','r',encoding='UTF-8').read()
print(result_utf8)
           

同理儲存的時候也一樣

title = '我麼'
with open('title.txt','a+',encoding ='UTF-8') as f:
	f.write(title)
	f.close()
           
python中解決中文亂碼什麼是字元編碼python 的字元編碼解決中文編碼問題