介紹
介紹
福哥今天給大家講講關於Python程式設計中的字串編碼轉換的問題,這個問題在初學者程式設計時候會經常遇到,如果要弄清楚這裡面的道道,還是需要好好學習一下的
什麼是編碼所謂編碼就是計算機標記一個漢字(或者是其他國家的文字)對應的數字,在不同編碼情況下同樣的一個漢字會對應不同的數字,比如:“福哥”在gbk編碼裡對應的是“205 172 184 163”,在gbk編碼裡一個漢字對應兩個數字,而“福哥”在utf-8編碼裡對應的是“229 144 140 231 166 143”,在utf-8編碼裡一個漢字對應三個數字。
常用編碼
GBK,英文全稱Chinese Internal Code Specification,中文全稱《漢字內碼擴充套件規範》,所謂的“國標”編碼方式UTF-8,英文全稱Universal Character Set/Unicode Transformation Format,是比較通用的一種編碼方式,支援幾乎全部國家的語言文字BIG5,大五碼,是用於繁體漢字的編碼方式ISO8859-1,單位元組編碼,是早期用於英文的網頁的編碼方式Unicode,統一碼,就是所有國家的語言文字編碼都會有一個方法轉換成Unicode編碼,然後Unicode編碼又可以轉換所有國家的語言文字編碼。所以,python在進行編碼轉換時候都是先用decode轉為unicode,再用encode轉為目標編碼IDLE編碼在編輯器裡定義的字串常量也是有編碼設定的,這個編碼可以透過指令碼“頁頭”進行宣告
宣告方法
在指令碼頁頭使用coding指定指令碼預設編碼
宣告編碼之後,後面程式碼裡出現的常量字串都會是這個編碼了
系統編碼在程式執行的時候也會有一個編碼設定,這個編碼就是系統編碼,預設的系統編碼是ascii編碼,我們也可以透過sys這個軟體包來設定它。
在我們使用print命令輸出資訊到控制檯的時候,就會嘗試使用系統編碼進行顯示了。而預設是ascii編碼在很多情況下會出現無法解碼的情況
檢視系統編碼
匯入sys,檢視系統編碼
import sysprint sys.getdefaultencoding()
設定系統編碼
匯入sys,使用reload重新整理sys,設定新的系統編碼
import sysreload(sys)sys.setdefaultencoding("gbk")
編碼轉換
既然編碼方式有那麼多,我們從不通的媒介上提取到的資料就有可能是不同的編碼方式的,如果要將這些資料統一成我們的程式碼使用的預設編碼,就需要學會編碼之間的轉換方法。
直接編碼轉換
在python下可以透過字串的decode和encode方法進行字串的編碼轉換操作
通用的技巧就是先透過decode方法將字串轉成unicode編碼,再透過encode方法將字串轉為指定的編碼
示例
指令碼預設是gbk編碼,先轉為utf-8編碼,再轉回gbk編碼
orgStr = "我是福哥"# print gbkgbkStr = orgStrprint gbkStr# gbk to utf-8utf8Str = gbkStr.decode("gbk").encode("utf-8")print utf8Str# utf-8 to gbkgbkStr = utf8Str.decode("utf-8").encode("gbk")print gbkStr
資料庫資料編碼轉換
從資料庫裡提取到的資料也是有編碼的,我們一定知道資料庫裡的資料的編碼方式,之後就可以透過直接編碼轉換的方式進行轉換了
示例
從資料庫裡查詢出一個欄位的資料,透過直接轉換方法進行編碼轉換
import pymysql# connectcn = pymysql.connect("192.168.1.168","test","abcdef")cs = cn.cursor()cn.select_db("test")# query and fetchcs.execute("select * from test")result = cs.fetchone()# utf8 to gbkutf8Str = result[1]gbkStr = utf8Str.decode("utf-8").encode("gbk")print gbkStr
網頁資料編碼轉換
使用selenium模擬瀏覽器獲取網頁上的內容資料也是有編碼的,這種情況下怎麼解決呢?
示例
使用selenium爬取到網頁的內容,透過find命令獲取到的元素上的文字,這個可以直接透過encode進行轉換,因為selenium已經幫助我們把文字轉換成unicode了
from selenium import webdriverchromeOpts = webdriver.ChromeOptions()chromeOpts.add_argument("--headless")chromeOpts.add_argument("--disable-gpu")chromeOpts.add_argument("--no-sandbox")chrome = webdriver.Chrome(options=chromeOpts)chrome.get("https://tongfu.net/")unicodeStr = chrome.find_element_by_css_selector(".topic-title").textgbkStr = unicodeStr.encode("gbk")print (gbkStr)
IDLE編碼、系統編碼、資料編碼上面我們提到了幾個概念,即:IDLE編碼、系統編碼、資料編碼,它們之間是什麼關係呢?
IDLE編碼
這個又稱之為編輯器編碼,這個編碼是告訴IDLE編輯器我們當前腳本里宣告的字串常量的編碼是什麼,如果沒有特別指定的話,預設會是ascii編碼,那樣是無法使用中文的。
系統編碼
有一些軟體包為了使程式設計師開發方便,會自動進行一些資料的編碼轉換,在進行自動轉換編碼的時候所依據的就是系統編碼了。
資料編碼
資料編碼是以變數為單位的,也就是說每一個變數都會有自己的編碼方式,我們在程式設計的時候需要根據情況對它們進行統一,否則會出現意想不到的問題
字串輸出如果要使字串可以正常透過print命令輸出到控制檯上,需要保證IDLE編碼和變數編碼一致,或者變數編碼為Unicode編碼
常見錯誤未指定IDLE編碼
如果沒有指定IDLE編碼,在輸出字串的時候就會報錯
SyntaxError: Non-ASCII character '\xb8' in file Encoding.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
IDLE和資料編碼不一致
如果指定的IDLE編碼和變數編碼不一樣會出現亂碼
總結今天福哥帶著大家學習了字串編碼的相關知識,後面再處理字串的時候就會比較清晰怎麼做了!否則,我們會稀裡糊塗地得到關於編碼的報錯資訊,諸如:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3010' in position 0: ordinal not in range(128)
或者
UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 105046: illegal multibyte sequence
等等這樣的錯誤資訊了
https://m.tongfu.net/home/35/blog/512813.html
相關內容
- 少兒程式設計,Scratch還是Python怎麼選?
- 怎麼理解Python語言基本演算法程式設計?
- 未來想往能源網際網路、人工智慧等方面發展,學程式設計的話是python還是java合適呢?
- python程式設計到底好不好學?
- 少兒程式設計教育應該從scratch還是python或者C C++開始呢?
- python程式設計如何透過重定向、管道或輸入檔案來作為指令碼的輸入?
- 想學習一門職業技術,糾結於程式設計python和設計ui之間,該如何選擇?
- 30多歲學點東西提升,考MBA或者學Python程式設計怎麼選?
- 看現在程式設計很火,想自學Python,但不知道會有什麼用,大神有什麼建議?
- 會C語言和java的人準備從事Java後端,有沒有必要學python程式設計呢?你怎麼看?