在最新的Python 3版本中,字符串是以Unicode編碼的,即Python的字符串支持多語言
html
編碼和解碼
字符串在內存中以Unicode表示,在操做字符串時,常常須要str和bytes互相轉換
字符串是能夠直接在內存上進行處理的,但若是要將其傳輸到網絡或磁盤上,須要將其編碼,反過來則須要解碼,由於str是不能夠直接存儲在磁盤上或在網絡上傳輸的
若是將字符串從內存傳輸到網絡或保存到磁盤,則要把str轉換爲以字節爲單位的bytes,稱爲編碼
若是要從網絡或磁盤上獲取字符串,則要從網絡上或者磁盤上讀取字節流,並把bytes轉換爲str,稱爲解碼
爲避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換,關於編碼,請參照字符編碼python
使用示例: 網絡
單個字符的編碼函數
print(ord('A')) #輸出:65,獲取字符的整數表示 print(chr(66)) #輸出:B,把編碼轉換爲對應的字符
十六進制表示編碼
print('中文') #輸出:'中文', print('\u4e2d\u6587') #輸出:'中文','\u4e2d\u6587'和'中文'徹底對等,若是知道字符的整數編碼,還能夠用十六進制這麼寫str
bytes類型的數據表示spa
x = b'ABC' #Python對bytes類型的數據用帶b前綴的單引號或雙引號表示,'ABC'和b'ABC'在顯示上徹底同樣,但bytes的每一個字符都只佔用一個字節
編碼code
print('ABC'.encode('ascii')) #輸出:b'ABC',以Unicode表示的str經過encode()方法能夠編碼爲指定的bytes print('中文'.encode('utf-8')) #輸出:b'\xe4\xb8\xad\xe6\x96\x87', print('中文'.encode('ascii')) #輸出:報錯,由於中文字符在ascii編碼範圍外,因此致使編碼失敗
解碼htm
print(b'ABC'.decode('ascii')) #輸出:'ABC' print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('ascii')) #輸出:'中文' print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')) #輸出:'中',若是bytes中只有一小部分無效的字節,能夠傳入errors='ignore'忽略錯誤的字節
計算長度blog
#len(a)函數返回a的長度,若是a是字符串則返回字符數,若是a是字節表示則返回字節數 print(len('中文')) #輸出:2,共2個字符 print(len('ABC')) #輸出:3,共3個字符 print(len(b'ABC')) #輸出:3,共是3個字節 print(len(b'\xe4\xb8\xad\xe6\x96\x87')) #輸出:6,共是6個字節 print(len('中文'.encode('utf-8'))) #輸出:6, 1箇中文字符通過UTF-8編碼後一般會佔用3個字節,所以兩個漢字的字節數是6
源碼文件開頭與編碼內存
#!/usr/bin/env python3 告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋 # -*- coding: utf-8 -*- 告訴Python解釋器,按照UTF-8編碼讀取源代碼,不然在源代碼中寫的中文輸出可能會有亂碼 #注意:告訴編譯器使用UTF-8編碼的同時,.py文件也要保存爲UTF-8 without BOM編碼,二者統一了,纔可確保文件中的中文正常顯示