Python全棧開發之Python基礎-字符編碼與轉碼
詳細文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
需知:
1.在python2默認編碼是ASCII, python3里默認是utf-8
2.unicode 分為 utf-32(占4個字節),utf-16(占兩個字節),utf-8(占1-4個字節), so utf-8就是unicode
3.在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
一、python2
- py2里默認編碼是ascii
- 文件開頭那個編碼聲明是告訴解釋這個代碼的程序 以什么編碼格式 把這段代碼讀入到內存,因為到了內存里,這段代碼其實是以bytes二進制格式存的,不過即使是2進制流,也可以按不同的編碼格式轉成2進制流,你懂么?
- 如果在文件頭聲明了#_*_coding:utf-8*_,就可以寫中文了, 不聲明的話,python在處理這段代碼時按ascii,顯然會出錯, 加了這個聲明后,里面的代碼就全是utf-8格式了
- 在有#_*_coding:utf-8*_的情況下,你在聲明變量如果寫成name=u"大保健",那這個字符就是unicode格式,不加這個u,那你聲明的字符串就是utf-8格式
- utf-8 to gbk怎么轉,utf8先decode成unicode,再encode成gbk
二、python3
- py3里默認文件編碼就是utf-8,所以可以直接寫中文,也不需要文件頭聲明編碼了,干的漂亮
- 你聲明的變量默認是unicode編碼,不是utf-8, 因為默認即是unicode了(不像在py2里,你想直接聲明成unicode還得在變量前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")即可以
- 但py3里,你在your_str.encode("gbk")時,感覺好像還加了一個動作,就是就是encode的數據變成了bytes里,我操,這是怎么個情況,因為在py3里,str and bytes做了明確的區分,你可以理解為bytes就是2進制流,你會說,我看到的不是010101這樣的2進制呀, 那是因為python為了讓你能對數據進行操作而在內存級別又幫你做了一層封裝,否則讓你直接看到一堆2進制,你能看出哪個字符對應哪段2進制么?什么?自己換算,得了吧,你連超過2位數的數字加減運算都費勁,還還是省省心吧。
- 那你說,在py2里好像也有bytes呀,是的,不過py2里的bytes只是對str做了個別名,沒有像py3一樣給你顯示的多出來一層封裝,但其實其內部還是封裝了的。 這么講吧, 無論是2還是三, 從硬盤到內存,數據格式都是 010101二進制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes類型-->按照指定編碼轉成你能看懂的文字
編碼應用比較多的場景應該是爬蟲了,互聯網上很多網站用的編碼格式很雜,雖然整體趨向都變成utf-8,但現在還是很雜,所以爬網頁時就需要你進行各種編碼的轉換,不過生活正在變美好,期待一個不需要轉碼的世界。
最后,編碼is a piece of fucking shit, noboby likes it.
ps:
python2 的用法
gbk轉成utf-8
1 [root@python2 scripts]# cat encode.py 2 #!/usr/bin/env python 3 # -*- coding:utf-8 -*- 4 #Author: nulige 5 6 import sys 7 print(sys.getdefaultencoding()) 8 9 s = "你好" 10 s_to_unicode = s.decode("utf-8") 11 print(s_to_unicode) 12 s_to_gbk = s_to_unicode.encode("gbk") 13 print(s_to_gbk) 14 15 gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8") 16 print(gbk_to_utf8)
執行結果:
1 [root@python2 scripts]# python encode.py 2 ascii #系統默認編碼 3 你好 4 ?oí 5 你好 #gbk轉成utf-8
utf-8是unicode的擴展集
1 [root@python2 scripts]# cat encode.py 2 #!/usr/bin/env python 3 # -*- coding:utf-8 -*- 4 #Author: nulige 5 6 import sys 7 print(sys.getdefaultencoding()) 8 9 s = u"你好" 10 print(s) 11 12 s_to_unicode = s.decode("utf-8") 13 print(s_to_unicode) 14 s_to_gbk = s_to_unicode.encode("gbk") 15 print(s_to_gbk) 16 17 gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8") 18 print(gbk_to_utf8)
執行結果:
1 [root@python2 scripts]# python encode.py 2 ascii 3 你好 #utf-8是unicode的擴展集,所以這里也是可以顯示中文的 4 Traceback (most recent call last): 5 File "encode.py", line 11, in <module> 6 s_to_unicode = s.decode("utf-8") 7 File "/usr/local/lib/python2.7/encodings/utf_8.py", line 16, in decode 8 return codecs.utf_8_decode(input, errors, True) 9 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
gbk轉成utf8
1 [root@python2 scripts]# cat encode.py 2 #!/usr/bin/env python 3 # -*- coding:utf-8 -*- 4 #Author: nulige 5 6 import sys 7 print(sys.getdefaultencoding()) 8 9 s = u"你好" 10 print(s) 11 12 s_to_gbk = s.encode("gbk") 13 print(s_to_gbk) 14 15 gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8") 16 print(gbk_to_utf8)
執行結果:
1 [root@python2 scripts]# python encode.py 2 ascii 3 你好 4 ?oí 5 你好
python3
1 #!/usr/bin/env python 2 #Author: nulige 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 s = "你哈" #默認是utf-8 8 s_gbk = s.encode("gbk") #utf-8轉成gbk 9 10 print(s_gbk) 11 print(s.encode())
執行結果:
1 utf-8 #python默認是utf-8 2 b'\xc4\xe3\xb9\xfe' #utf-8轉成gbk
3 b'\xe4\xbd\xa0\xe5\x93\x88'
1 #!/usr/bin/env python 2 #Author: nulige 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 s = "你哈" 8 s_gbk = s.encode("gbk") 9 10 print(s_gbk) 11 print(s.encode()) 12 13 gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8") #gbk轉成utf-8 14 print("utf8",gbk_to_utf8)
執行結果:
1 utf-8 2 b'\xc4\xe3\xb9\xfe' 3 b'\xe4\xbd\xa0\xe5\x93\x88' 4 utf8 b'\xe4\xbd\xa0\xe5\x93\x88'
總結
把PyCharm字符編碼調成gbk
1 #!/usr/bin/env python 2 # -*-coding:gbk-*- 3 #Author: nulige 4 5 #不同字符編碼要先轉成uncode 6 import sys 7 print(sys.getdefaultencoding()) 8 9 s = '你好' #默認uncode 10 print(s.encode("gbk")) 11 print(s.encode("utf-8")) 12 print(s.encode("utf-8").decode("utf-8").encode("gb2312")) 13 print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))
執行結果:
1 utf-8 2 b'\xc4\xe3\xba\xc3' 3 b'\xe4\xbd\xa0\xe5\xa5\xbd' 4 b'\xc4\xe3\xba\xc3' 5 你好
作業:
python2 or python 3
記住:所有字符集的轉換,都要經過unicode
1、把gbk2312 to utf-8
2、把utf-8 to gbk