首頁>技術>

介紹

介紹

福哥今天給大家講講關於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

8
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 什麼是2021年最佳的後端開發框架