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


提示:上一篇文章中介紹了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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM