成人免费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-11 14:56:00

Docker容器工具

2019-11-14 09:55:35

開發技能代碼

2020-11-12 10:37:29

微服務

2022-05-27 08:18:00

HashMapHash哈希表

2009-12-16 09:44:57

Linux桌面Linux

2021-07-13 12:21:34

PythonRPC通信

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

安全框架信息安全

2018-08-17 09:14:43

餓了么容器演進

2020-12-10 13:46:35

人工智能

2020-05-06 19:47:15

人工智能AI

2025-03-28 08:53:51

2018-09-28 09:32:57

2017-08-09 15:07:08

大數據數據分析戶畫像

2009-06-12 08:39:07

BSM運維管理北塔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜三级在线观看 | 久久精品无码一区二区三区 | 天堂亚洲 | 亚洲电影一区二区三区 | a视频在线观看 | 久久精品国产99国产精品 | 少妇精品久久久久久久久久 | 九九精品在线 | 国产视频福利在线观看 | 成人在线欧美 | 欧美日韩黄色一级片 | 亚洲啊v| 欧美影院久久 | 日韩欧美手机在线 | 日韩在线中文 | 日本电影网站 | 日韩三区 | 亚洲欧洲在线观看视频 | 激情av网站| 国产成人精品视频在线观看 | 天天看天天操 | 国产精品久久久久久一区二区三区 | 亚洲久久| 91亚洲精品国偷拍自产在线观看 | 精久久 | 欧美日韩国产免费 | 性视频一区 | 美女天堂在线 | 日韩三级免费观看 | 激情欧美一区二区三区中文字幕 | 在线不卡av| 亚洲欧美综合 | 欧美啪啪 | 欧美性一区二区三区 | 成人二区 | 九九热最新视频 | 午夜久久久久久久久久一区二区 | 午夜免费视频 | 亚洲精品中文字幕中文字幕 | 成人精品久久久 | 国产99久久久国产精品下药 |