国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

有了這篇文章, 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

2021-02-24 07:38:50

Redis

2015-03-30 15:28:42

創業創業融資七牛

2019-11-14 09:55:35

開發技能代碼

2020-11-12 10:37:29

微服務

2025-05-26 08:27:00

2022-05-27 08:18:00

HashMapHash哈希表

2020-11-11 14:56:00

Docker容器工具

2021-07-13 12:21:34

PythonRPC通信

2016-12-19 15:30:16

安全框架信息安全

2022-04-14 10:10:59

Nginx開源Linux

2019-10-31 09:48:53

MySQL數據庫事務

2020-05-06 19:47:15

人工智能AI

2020-12-10 13:46:35

人工智能

2025-03-28 08:53:51

2009-12-16 09:44:57

Linux桌面Linux

2018-08-17 09:14:43

餓了么容器演進

2018-09-28 09:32:57

2017-08-09 15:07:08

大數據數據分析戶畫像

2011-11-21 13:11:46

Wi-Fi下一代熱點
點贊
收藏

51CTO技術棧公眾號

国产精品va无码一区二区| 97超碰人人在线| 精品久久视频| 色综久久综合桃花网| 鲁鲁在线中文| 欧美一区二区精品在线| 久久久亚洲精华液精华液精华液| 国产亚洲欧美中文| 99久热在线精品视频| 精品一区二区三区影院在线午夜 | 午夜视频在线看| 午夜国产不卡在线观看视频| av漫画网站| 亚洲国产精品v| 亚洲77777| 国产精品久久久久一区| 精品日韩久久久| 综合在线观看色| 2019一级黄色毛片免费看网 | 在线不卡免费欧美| 成人高清免费观看mv| 天天操天天干天天综合网| 亚洲欧洲动漫| 91精品福利视频| 欧美成人hd| 亚洲国产精品国自产拍av秋霞| 欧美少妇网站| 久久手机精品视频| 最新国产一区| 亚洲最大福利视频网站| 国产农村妇女精品一二区| 日韩av电影免费观看| 国产福利一区在线| 国产女女做受ⅹxx高潮| ...av二区三区久久精品| 中国在线观看免费国语版电影| 色综合久久中文字幕| 呦呦在线视频| 亚洲一级一级97网| 亚洲高清在线一区| 成人激情春色网| 国产精品外国| 人妻少妇精品久久| 亚洲欧美日韩成人高清在线一区| 一级在线免费观看| 亚洲成人aaa| 日韩精品亚洲专区在线观看| 国产免费亚洲高清| 蜜桃精品视频在线| www.99re.av| 欧美日韩视频在线观看一区二区三区 | 欧美极品第一页| 欧美手机在线| 黑人另类av| 成人性视频免费网站| 国产青青视频| 日韩视频一区二区| 亚洲性视频在线| 97人人澡人人爽| 国产精品一级片在线观看| a视频v在线| 亚洲成人av在线| 欧美日韩一区二区三区在线电影| 国产成人成网站在线播放青青 | 国产精品区二区三区日本| 国产乱码精品一区二区三区忘忧草| 天天爽夜夜爽一区二区三区| 欧美午夜宅男影院在线观看| 日韩电影大全网站| 91在线播放国产| www国产亚洲精品久久麻豆| 奇米影视888狠狠狠777不卡| 日韩在线观看免费av| 日本一区二区高清不卡| 日本一级淫片演员| 精品久久久久久久中文字幕| 成人av色网站| 亚洲淫片在线视频| 久久午夜羞羞影院免费观看| 国精产品一区| 国产精品18久久久久久首页狼| 国产一区二区三区高清播放| 日本aaa在线观看| 欧美激情亚洲激情| 久久精品国产网站| 国产一级免费在线观看| 国语自产偷拍精品视频偷 | 日韩在线三级| 午夜欧美视频在线观看| 久久精品一级| 宅男一区二区三区| 一本到不卡精品视频在线观看| 欧美aaa级| 日日噜噜噜噜夜夜爽亚洲精品| 成人综合久久| 免费黄色特级片| 亚洲激情视频在线播放| 亚洲手机视频| aaaaaaa大片免费看| 亚洲色图13p| 亚洲人成人一区二区三区| 亚洲an天堂an在线观看| 国产丝袜一区视频在线观看| 亚洲欧洲一区| 日本福利在线观看| 国产精品入口福利| 久久久久久久久久看片| 国产精品电影| 国产一区国产精品| 亚洲成人一区二区在线观看| 国产精品qvod| 久久久久久香蕉| 久久久成人av| 国产盗摄女厕一区二区三区| 一区二区三区伦理| 久久青青草原一区二区| 欧美男同性恋视频网站| 国产精品自拍区| 亚洲国产日韩欧美在线观看| 日韩在线视频观看正片免费网站| 国产乱码精品一区二区三区忘忧草| 七七久久电影网| 亚洲成人自拍视频| 亚洲国产一区二区三区在线观看| 日韩国产欧美在线视频| 国精一区二区三区| 在线观看日韩羞羞视频| 日韩麻豆第一页| 成人免费毛片片v| crdy在线观看欧美| 波多野结衣天堂| 欧美激情xxxx性bbbb| 久久综合色播五月| 亚洲成人黄色| 男男做性免费视频网| 国产精品视频中文字幕91| 亚洲欧洲国产日韩| 成久久久网站| 阿v免费在线观看| 好吊色欧美一区二区三区视频| 精品视频一区三区九区| 国产一区二区你懂的| 国产美女一区视频| 永久免费网站视频在线观看| 色综久久综合桃花网| 国产欧美日韩在线| 超碰成人久久| 在线观看a视频| 日韩av一区二区三区在线观看| 亚洲精品一区二区在线观看| 国产精品66部| 97视频一区| 欧美18xxxxx| 欧美日韩国产一二| 亚洲欧美中文字幕| 国产精品嫩草久久久久| 成人情趣视频网站| 黄色片网站在线| 久久精品无码中文字幕| 久久久久久久999| 欧美日韩一区二区三区在线免费观看 | 日本精品va在线观看| 色欧美片视频在线观看| 丝袜美腿亚洲综合| 中文字幕日韩亚洲| julia中文字幕久久亚洲蜜臀| 91丝袜脚交足在线播放| 日韩成人av网址| 中文字幕久久午夜不卡| 一区二区三区四区在线观看国产日韩| 欧美精品videossex少妇| 亚洲国产精品久久久久婷蜜芽| 日本高清视频精品| 欧美日韩一级二级| 福利一区二区在线观看| 久久91精品| 久久av色综合| 啦啦啦在线视频免费观看高清中文| 久久偷看各类wc女厕嘘嘘偷窃| 久久这里只有精品99| 欧美亚洲自拍偷拍| 久久新电视剧免费观看| 一本色道久久综合亚洲精品不| 国产精品高清一区二区| 国产三级在线观看| 日本wwww视频| 精品999在线观看| 欧美日本亚洲视频| 宅男噜噜噜66一区二区66| 国产丝袜欧美中文另类| 巨乳诱惑日韩免费av| 欧美天堂社区| 黄色aa久久| 黄色在线观看网| 欧美性大战久久久久xxx| 国产 高清 精品 在线 a| 久久久久在线观看| 亚洲欧美日韩一区二区在线| 在线精品视频一区二区| 日韩理论片在线|