成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有了這篇文章, Python 中的編碼不再是噩夢

開發 后端
今天我把大家在 Python 上會遇到的一些編碼問題都講清楚了,以后你可以不用再 Google,收藏這篇文章就行。

Python 中編碼問題,一直是很多 Python 開發者的噩夢,盡管你是工作多年的 Python 開發者,也肯定會經常遇到令人神煩的編碼問題,好不容易花了半天搞明白了。

一段時間后,又全都忘光光了,一臉懵逼的你又開始你找各種博客、帖子,從頭搞清楚什么是編碼?什么是 unicode?它和 ASCII 有什么區別?為什么 decode encode 老是報錯?python2 里和 python3 的字符串類型怎么都不一樣,怎么對應起來?如何檢測編碼格式?

反反復復,這個過程真是太痛苦了。

今天我把大家在 Python 上會遇到的一些編碼問題都講清楚了,以后你可以不用再 Google,收藏這篇文章就行。

1. Python 3 中 str 與 bytes

在 Python3中,字符串有兩種類型 ,str 和 bytes。

今天就來說一說這二者的區別:

  • unicode string(str 類型):以 Unicode code points 形式存儲,人類認識的形式
  • byte string(bytes 類型):以 byte 形式存儲,機器認識的形式

在 Python 3 中你定義的所有字符串,都是 unicode string類型,使用 type 和 isinstance 可以判別:

  1. # python3 
  2.  
  3. >>> str_obj = "你好" 
  4. >>>  
  5. >>> type(str_obj) 
  6. <class 'str'> 
  7. >>>  
  8. >>> isinstance("你好", str) 
  9. True 
  10. >>>  
  11. >>> isinstance("你好", bytes) 
  12. False 
  13. >>>  

而 bytes 是一個二進制序列對象,你只要你在定義字符串時前面加一個 b,就表示你要定義一個 bytes 類型的字符串對象。

  1. # python3 
  2. >>> byte_obj = b"Hello World!" 
  3. >>> type(byte_obj) 
  4. <class 'bytes'> 
  5. >>>  
  6. >>> isinstance(byte_obj, str) 
  7. False 
  8. >>>  
  9. >>> isinstance(byte_obj, bytes) 
  10. True 
  11. >>>  

但是在定義中文字符串時,你就不能直接在前面加 b 了,而應該使用 encode 轉一下。

  1. >>> byte_obj=b"你好" 
  2.   File "<stdin>", line 1 
  3. SyntaxError: bytes can only contain ASCII literal characters. 
  4. >>>  
  5. >>> str_obj="你好" 
  6. >>>  
  7. >>> str_obj.encode("utf-8") 
  8. b'\xe4\xbd\xa0\xe5\xa5\xbd' 
  9. >>>  

2. Python 2 中 str 與 unicode

而在 Python2 中,字符串的類型又與 Python3 不一樣,需要仔細區分。

在 Python2 里,字符串也只有兩種類型,unicode 和 str 。

只有 unicode object 和 非unicode object(其實應該叫 str object) 的區別:

  • unicode string(unicode類型):以 Unicode code points 形式存儲,人類認識的形式
  • byte string(str 類型):以 byte 形式存儲,機器認識的形式

當我們直接使用雙引號或單引號包含字符的方式來定義字符串時,就是 str 字符串對象,比如這樣:

  1. # python2 
  2.  
  3. >>> str_obj="你好" 
  4. >>> 
  5. >>> type(str_obj) 
  6. <type 'str'> 
  7. >>> 
  8. >>> isinstance(str_obj, bytes) 
  9. True 
  10. >>> isinstance(str_obj, str) 
  11. True 
  12. >>> 

而當我們在雙引號或單引號前面加個 u,就表明我們定義的是 unicode 字符串對象,比如這樣:

  1. # python2 
  2.  
  3. >>> unicode_obj = u"你好" 
  4. >>> 
  5. >>> type(unicode_obj) 
  6. <type 'unicode'> 
  7. >>> 
  8. >>> isinstance(unicode_obj, bytes) 
  9. False 
  10. >>> isinstance(unicode_obj, str) 
  11. False 
  12. >>> 

3. 如何檢測對象的編碼

所有的字符,在 unicode 字符集中都有對應的編碼值(英文叫做:code point)。

而把這些編碼值按照一定的規則保存成二進制字節碼,就是我們說的編碼方式,常見的有:UTF-8,GB2312 等。

也就是說,當我們要將內存中的字符串持久化到硬盤中的時候,都要指定編碼方法,而反過來,讀取的時候,也要指定正確的編碼方法(這個過程叫解碼),不然會出現亂碼。

那問題就來了,當我們知道了其對應的編碼方法,我們就可以正常解碼,但并不是所有時候我們都能知道應該用什么編碼方式去解碼?

這時候就要介紹到一個 python 的庫 -- chardet ,使用它之前 需要先安裝:

  1. python3 -m pip install chardet 

chardet 有一個 detect 方法,可以 預測其其編碼格式:

  1. >>> import chardet 
  2. >>> chardet.detect('微信公眾號:Python編程時光'.encode('gbk')) 
  3. {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'} 

為什么說是預測呢,通過上面的輸出來看,你會看到有一個 confidence 字段,其表示預測的可信度,或者說成功率。

但是使用它時,若你的字符數較少,就有可能 “誤診”),比如只有 中文 兩個字,就像下面這樣,我們是 使用 gbk 編碼的,使用 chardet 卻識別成 KOI8-R 編碼。

  1. >>> str_obj = "中文" 
  2. >>> byte_obj = bytes(a, encoding='gbk')  # 先得到一個 gbk 編碼的 bytes 
  3. >>> 
  4. >>> chardet.detect(byte_obj) 
  5. {'encoding': 'KOI8-R', 'confidence': 0.682639754276994, 'language': 'Russian'} 
  6. >>>  
  7. >>> strstr_obj2 = str(byte_obj, encoding='KOI8-R'
  8. >>> str_obj2 
  9. 'жпнд' 

所以為了編碼診斷的準確,要盡量使用足夠多的字符。

chardet 支持多國的語言,從官方文檔中可以看到支持如下這些語言

(https://chardet.readthedocs.io/en/latest/supported-encodings.html)。

4. 編碼與解碼的區別

編碼和解碼,其實就是 str 與 bytes 的相互轉化的過程(Python 2 已經遠去,這里以及后面都只用 Python 3 舉例)

  • 編碼:encode 方法,把字符串對象轉化為二進制字節序列
  • 解碼:decode 方法,把二進制字節序列轉化為字符串對象

Unicode & Character Encodings in Python

那么假如我們真知道了其編碼格式,如何來轉成 unicode 呢?

有兩種方法:

第一種是,直接使用 decode 方法

  1. >>> byte_obj.decode('gbk') 
  2. '中文' 
  3. >>>  

第二種是,使用 str 類來轉

  1. >>> strstr_obj = str(byte_obj, encoding='gbk'
  2. >>> str_obj 
  3. '中文' 
  4. >>>  

5. 如何設置文件編碼

在 Python 2 中,默認使用的是 ASCII 編碼來讀取的,因此,我們在使用 Python 2 的時候,如果你的 python 文件里有中文,運行是會報錯的。

  1. SyntaxError: Non-ASCII character '\xe4' in file demo.py 

原因就是 ASCII 編碼表太小,無法解釋中文。

而在 Python 3 中,默認使用的是 uft-8 來讀取,所以省了不少的事。

對于這個問題,通常解決方法有兩種:

(1) 第一種方法

在 python2 中,可以使用在頭部指定

可以這樣寫,雖然很好看

  1. # -*- coding: utf-8 -*-  

但這樣寫太麻煩了,我通常使用下面兩種寫法

  1. # coding:utf-8 
  2. coding=utf-8  

(2) 第二種方法

  1. import sys  
  2.  
  3. reload(sys)  
  4. sys.setdefaultencoding('utf-8')  

這里在調用sys.setdefaultencoding(‘utf-8’) 設置默認的解碼方式之前,執行了reload(sys),這是必須的,因為python在加載完sys之后,會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入sys,才能調用 sys.setdefaultencoding 這個方法。

以上就是我今天總結的 Python 開者最關心的編碼問題,而對于編碼的基礎知識,仍然需要你提前借助搜索引擎來學習。

 

責任編輯:趙寧寧 來源: Python編程時光
相關推薦

2013-07-03 09:32:31

IEInternet Ex

2015-03-30 15:28:42

創業創業融資七牛

2021-02-24 07:38:50

Redis

2020-11-12 10:37:29

微服務

2020-11-11 14:56:00

Docker容器工具

2019-11-14 09:55:35

開發技能代碼

2021-07-13 12:21:34

PythonRPC通信

2022-05-27 08:18:00

HashMapHash哈希表

2009-12-16 09:44:57

Linux桌面Linux

2025-05-26 08:27:00

2019-10-31 09:48:53

MySQL數據庫事務

2022-04-14 10:10:59

Nginx開源Linux

2016-12-19 15:30:16

安全框架信息安全

2020-12-10 13:46:35

人工智能

2020-05-06 19:47:15

人工智能AI

2025-03-28 08:53:51

2018-08-17 09:14:43

餓了么容器演進

2018-09-28 09:32:57

2017-08-09 15:07:08

大數據數據分析戶畫像

2009-06-12 08:39:07

BSM運維管理北塔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区精品自拍 | 亚洲精品一区国产精品 | 久久久精品久久 | 91看片免费| 久久国产精品久久久久久 | 亚洲一区二区 | 97精品超碰一区二区三区 | 国产亚洲精品久久久久动 | 国产91久久精品一区二区 | 一区二区三区四区毛片 | 手机三级电影 | 精久久久 | 亚洲综合色自拍一区 | 日韩精品一区二区三区第95 | 99re| 亚洲人成人一区二区在线观看 | 成人国产精品免费观看 | 久久久久久美女 | 亚洲高清在线 | 久久成人一区 | 精品1区2区3区4区 | 亚洲综合色 | 精品久久久久久久久久久久久久 | 亚洲顶级毛片 | 国产精品亚洲成在人线 | 久久久久免费精品国产 | 国产视频二区 | av网站在线免费观看 | 欧美性video| 精品成人在线观看 | 亚洲高清久久 | 免费艹逼视频 | 一区二区中文 | 日韩羞羞| 成人av一区二区亚洲精 | 欧美亚洲国产一区二区三区 | 天天艹 | 91精品国产欧美一区二区 | 国产精品日韩欧美一区二区三区 | 亚洲欧美视频一区 | 国产一区久久 |