提示:上一篇文章中介紹了Python字串的使用,本篇文章來說說Python字串的編碼與轉義。
在此之前,我們先介紹一下在Python中如何檢視一個變數的型別。
1、檢視變數型別
(1)type( )
函式說明
- 在Python中,
type( )
函式是一個最實用又簡單的檢視物件資料型別的方法。 type( )
函式是Python的一個內建的函式,呼叫它就能夠得到一個反回值,從而知道想要查詢的對像型別資訊。type( )
函式的作用:
只有第一個引數時,則返回物件的型別。多個引數以後用到在詳細說。type( )
函式的使用方法:type(object)
(2)示例
"""
type()函式用來檢查值的型別。
該函式會將檢查的結果作為返回值返回,可以通過變數來接收函式的返回值。
注意: type()函式檢視的是變數對應空間中儲存的值的型別。
"""
a = type('123')
print(a) # <class 'str'>
# 檢視我們所學過的資料型別
print(type(1)) # <class 'int'>
print(type(1.5)) # <class 'float'>
print(type(True)) # <class 'bool'>
print(type('hello')) # <class 'str'>
print(type(None)) # <class 'NoneType'>
提示:
type( )
函式的強大功能並非只能用於檢視變數型別,以後用到再總結。
2、轉義字元
(1)轉義字元說明
- 有部分符號在Python中是有特殊含義的,當需要使用符號自身原有的意思時,這時可以通過轉義字元表示。
- 轉義字元的意義就是避免出現二義性,避免系統識別錯誤。
(2)示例
# 1、如果字串內部既包含'又包含"怎麼辦?
# 可以用轉義字元`\`來標識
print("北京的金山上,"光芒"照四方。") # SyntaxError: invalid syntax
# 使用轉義字元解決
print("北京的金山上,\"光芒\"照四方。")
# 使用上邊說的引號之間的巢狀解決
print('北京的金山上,"光芒"照四方。')
"""
# 2、轉義字元`\`可以轉義很多字元,
比如`\n`表示換行,
`\t`表示製表符,
字元`\`本身也要轉義,所以`\\`表示的字元就是`\`,
"""
# 輸出結果:子曰:"學而時習之,\\n樂呵樂呵!"
s = "子曰:\"學而時習之,\\\\n樂呵樂呵!\""
print(s)
(3)常用轉義字元對照表
轉義字元 | 描述 |
---|---|
\ (在行尾時) |
續行符 |
\\ |
反斜槓符號 |
\' |
單引號 |
\" |
雙引號 |
\a |
響鈴 |
\b |
退格(Backspace ) |
\e |
轉義 |
\000 |
空 |
\n |
換行 |
\v |
縱向製表符 |
\t |
橫向製表符,一個tab鍵(4個空格)的距離 |
\r |
回車 |
\f |
換頁 |
\oyy |
八進位制數,yy 代表的字元,例如:\o12 代表換行 |
\xyy |
十六進位制數,yy 代表的字元,例如:\x0a 代表換行 |
\other |
其它的字元以普通格式輸出 |
提示:轉義、去轉義線上工具:http://www.bejson.com
3、字元編碼
字串有一個比較特殊的問題,就是編碼問題。
(1)字元編碼介紹
1)字元編碼的由來:
因為計算機只能處理二進位制數字,也就是0和1。如果要處理文字,就必須先把文字轉換為數字才能處理。
由於計算機是美國人發明的,因此,最早只有127個字元被編碼到計算機裡,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII
編碼,比如大寫字母A
的編碼是65
,小寫字母z
的編碼是122
。
但是要處理中文顯然一個位元組是不夠的,至少需要兩個位元組,而且還不能和ASCII編碼衝突,所以,中國製定了GB2312
編碼,用來把中文編進去。
你可以想得到的是,全世界有上百種語言,日本把日文編到Shift_JIS
裡,韓國把韓文編到Euc-kr
裡,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文字中,顯示出來會有亂碼。
2)Unicode
編碼介紹:
如上所述,Unicode
編碼應運而生,又稱為萬國碼。Unicode
編碼把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。
Unicode
編碼標準也在不斷髮展,但最常用的是用兩個位元組表示一個字元(如果要用到非常偏僻的字元,就需要4個位元組)。現代作業系統和大多數程式語言都直接支援Unicode
編碼。
3)UTF-8
編碼介紹:
然而新的問題又出現了:如果統一成Unicode
編碼,亂碼問題從此消失了。但是,如果你寫的文字基本上全部是英文的話,用Unicode
編碼比ASCII
編碼需要多一倍的儲存空間,在儲存和傳輸上就十分不划算。
所以,本著節約的精神,又出現了把Unicode
編碼轉化為“可變長編碼”的UTF-8
編碼。UTF-8
編碼把一個Unicode
編碼字元根據不同的數字大小編碼成1-6個位元組【8個位元(bit
)作為一個位元組(byte
)】,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文字元(如果統一標準的話,一個英文字元要補2-3個位元組的0),用UTF-8編碼就能節省空間。
如下圖所示:
因為我們編寫的程式碼檔案中,絕大部分都是英文,所以我們常用的編碼格式為UTF-8
編碼。
UTF-8
編碼還有一個額外的好處,就是ASCII
編碼實際上可以被看成是UTF-8
編碼的一部分,所以,大量只支援ASCII
編碼的歷史遺留軟體可以在UTF-8
編碼下繼續工作。
(2)Python中的字元編碼
Python3的預設編碼是UTF-8
編碼,可通過如下程式碼檢視。
import sys
# 可檢視Python3的預設編碼。
print(sys.getdefaultencoding())
# 下面的方式也可以檢視
print(sys.stdout.encoding)
Python3中字元編碼經常會使用到decode
和encode
函式。特別是在抓取網頁中,這兩個函式用的熟練非常有好處。
encode
(編碼)的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode
(解碼)剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、“人模人樣”的形式。
如下圖所示:
(3)編碼格式應用於不同場景
資料在記憶體當中處理時,使用的格式是Unicode
,統一標準。
在硬碟上儲存,或者是在網路上傳輸時,用的是UTF-8
,因為省空間。
參考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896