解決中文亂碼
- 什麼是字元編碼
- python 的字元編碼
-
- encode和decode
-
- unicode還可以decode嗎?
- UTF-8還可以encode嗎?
- 解決中文編碼問題
-
- 問題1:使用requests擷取網站内容後,出現中文亂碼
- 問題2:非法字元抛出異常
- 問題3:網頁可能使用了gzip壓縮
- 問題4:讀取檔案的中文亂碼
什麼是字元編碼
總的來說,字元串的編碼都隻有兩大類:
- 通用的
編碼。Unicode
- 将
轉化成的某種類型的編碼。如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位設為0,後面7位為這個符号的
Unicode碼。是以對于英語字母。 UTF−8 編碼和ASCII碼是相同的。
- 對于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
編碼兩種類型。
- str字元串:使用
編碼。Unicode
- bytes字元串:使用将
轉化成的某種類型的編碼,如Unicode
python3預設字元型編碼為Unicode,但python2則不是。UTF-8
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()