『無為則無心』Python基礎 — 9、Python字串的編碼與轉義

繁華似錦Fighting發表於2021-06-27

提示:上一篇文章中介紹了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編碼就能節省空間。

如下圖所示:

image

因為我們編寫的程式碼檔案中,絕大部分都是英文,所以我們常用的編碼格式為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中字元編碼經常會使用到decodeencode函式。特別是在抓取網頁中,這兩個函式用的熟練非常有好處。

  • encode(編碼)的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。
  • decode(解碼)剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、“人模人樣”的形式。

如下圖所示:

image

(3)編碼格式應用於不同場景

資料在記憶體當中處理時,使用的格式是Unicode,統一標準。

在硬碟上儲存,或者是在網路上傳輸時,用的是UTF-8,因為省空間。

參考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896

相關文章