最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3編碼問題匯總

 更新時間:2016年09月06日 08:56:45   投稿:hebedich  
本文給通過一個具體的編碼問題的解決辦法,給大家詳細(xì)分享了python中的編碼問題的來龍去脈,非常的細(xì)致全面,有需要的小伙伴可以參考下

這兩天寫了個監(jiān)測網(wǎng)頁的爬蟲,作用是跟蹤一個網(wǎng)頁的變化,但運(yùn)行了一晚出現(xiàn)了一個問題。。。。希望大家不吝賜教!
我用的是python3,錯誤在對html response的decode時拋出,代碼原樣為:

response = urllib.urlopen(dsturl)
content = response.read().decode('utf-8')

拋出錯誤為

 File "./unxingCrawler_p3.py", line 50, in getNewPhones
  content = response.read().decode()
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 24137: invalid start byte

之前運(yùn)行都沒問題,經(jīng)過一晚上就出現(xiàn)了。。。。最不明白的是在它聲明為utf-8編碼的網(wǎng)頁中為什么會出現(xiàn)utf-8無法解析的字符?

后來經(jīng)過熱心網(wǎng)友的提醒,才發(fā)現(xiàn)需要使用decode('utf-8', 'ignore')

為了徹底鬧明白python的編碼問題,特分享下文,希望對大家熟悉python的編碼問題帶來些幫助

1.從字節(jié)說起:

一個字節(jié)包括八個比特位,每個比特位表示0或1,一個字節(jié)即可表示從00000000到11111111共2^8=256個數(shù)字。一個ASCII編碼使用一個字節(jié)(除去字節(jié)的最高位作為作奇偶校驗(yàn)位),ASCII編碼實(shí)際使用一個字節(jié)中的7個比特位來表示字符,共可表示2^7=128個字符。比如ASCII編碼中的01000001(即十進(jìn)制的65)表示字符'A',01000001加上32之后的01100001(即十進(jìn)制的97)表示字符'a'?,F(xiàn)在打開Python,調(diào)用chr和ord函數(shù),我們可以看到Python為我們對ASCII編碼進(jìn)行了轉(zhuǎn)換。如圖

第一個00000000表示空字符,因此ASCII編碼實(shí)際上只包括了 字母、標(biāo)點(diǎn)符號、特殊符號等共127個字符。因?yàn)锳SCII是在美國出生的,對于由字母組成單詞進(jìn)而用單詞表達(dá)的英文來說也是夠了。但是中國人、日本人、 韓國人等其他語言的人不服了。中文是一個字一個字,ASCII編碼用上了渾身解數(shù)256個字符都不夠用。

因此后來出現(xiàn)了Unicode編碼。Unicode編碼通常由兩個字節(jié)組成,共表示256*256個字符,即所謂的UCS-2。某些偏僻字還會用到四個字節(jié),即所謂的UCS-4。也就是說Unicode標(biāo)準(zhǔn)也還在發(fā)展。但UCS-4出現(xiàn)的比較少,我們先記?。?最原始的ASCII編碼使用一個字節(jié)編碼,但由于語言差異字符眾多,人們用上了兩個字節(jié),出現(xiàn)了統(tǒng)一的、囊括多國語言的Unicode編碼。

在Unicode中,原本ASCII中的127個字符只需在前面補(bǔ)一個全零的字節(jié)即可,比如前文談到的字符‘a(chǎn)':01100001,在Unicode中變成了00000000 01100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個字節(jié)就能傳輸?shù)挠⑽默F(xiàn)在變成兩個字節(jié),非常浪費(fèi)存儲空間和傳輸速度。

人們再發(fā)揮聰明才智,于是出現(xiàn)了UTF-8編碼。因?yàn)獒槍Φ氖强臻g浪費(fèi)問題,因此這種 UTF-8編碼是可變長短的 ,從英文字母的一個字節(jié),到中文的通常的三個字節(jié),再到某些生僻字的六個字節(jié)。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟件現(xiàn)在在UTF-8編碼中可以繼續(xù)工作。

注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如​漢字的‘中'字在Unicode中是01001110 00101101,而在UTF-8編碼中是11100100 10111000 10101101。

我們祖國母親自然也有自己的一套標(biāo)準(zhǔn)。那就是GB2312和GBK。當(dāng)然現(xiàn)在挺少看到。通常都是直接使用UTF-8。

2.Python3中的默認(rèn)編碼

Python3中默認(rèn)是UTF-8,我們通過以下代碼:

import sys

sys.getdefaultencoding()

可查看Python3的默認(rèn)編碼。​

3.Python3中的​encode和decode

Python3中字符編碼經(jīng)常會使用到decode和encode函數(shù)。特別是在抓取網(wǎng)頁中,這兩個函數(shù)用的熟練非常有好處。encode的作用,使我們看到的直觀的字符轉(zhuǎn)換成計(jì)算機(jī)內(nèi)的字節(jié)形式。decode剛好相反,把字節(jié)形式的字符轉(zhuǎn)換成我們看的懂的、直觀的、“人模人樣”的形式。

\x表示后面是十六進(jìn)制, \xe4\xb8\xad即是二進(jìn)制的 11100100 10111000 10101101。也就是說漢字‘中'encode成字節(jié)形式,是 11100100 10111000 10101101。同理,我們拿 11100100 10111000 10101101也就是 \xe4\xb8\xad來decode回來,就是漢字‘中'。完整的應(yīng)該是 b'\xe4\xb8\xad',在Python3中, 以字節(jié)形式表示的字符串則必須加上 前綴b,也就是寫成上文的b'xxxx'形式。

前文說的Python3的默認(rèn)編碼是UTF-8,所以我們可以看到,Python處理這些字符的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字符encode為UTF-8編碼,出來的結(jié)果還是相同:b'\xe4\xb8\xad'。

明白了這一點(diǎn),同時我們知道​UTF-8兼容ASCII,我們可以猜想大學(xué)時經(jīng)常背誦的‘A'對應(yīng)ASCII中的65,在這里是不是也能正確的decode出來呢。十進(jìn)制的65轉(zhuǎn)換成十六進(jìn)制是41,我們嘗試下:

b'\x41'.decode()

結(jié)果如下。果然是字符‘A'

4.Python3中的​編碼轉(zhuǎn)換

據(jù)說字符在計(jì)算機(jī)的內(nèi)存中統(tǒng)一是以Unicode編碼的。只有在字符要被寫進(jìn)文件、存進(jìn)硬盤或者從服務(wù)器發(fā)送至客戶端(例如網(wǎng)頁前端的代碼)時會變成utf-8。但其實(shí)我比較關(guān)心怎么把這些字符以Unicode的字節(jié)形式表現(xiàn)出來,露出它在內(nèi)存中的廬山正面目的。這里有個照妖鏡:

xxxx.encode/decode('unicode-escape')

b'\\u4e2d'還是b'\u4e2d,一個斜杠貌似沒影響。同時可以 發(fā)現(xiàn)在shell窗口中,直接輸 '\u4e2d'和輸入b '\u4e2d'.decode('unicode-escape')是相同的,都會打印出漢字‘中', 反而是 '\u4e2d'.decode('unicode-escape')會報(bào)錯。說明 說明Python3不僅支持Unicode,而且一個‘\uxxxx'格式的 Unicode字符 可被辨識且被等價于str類型。

如果我們知道一個Unicode字節(jié)碼,怎么變成UTF-8的字節(jié)碼呢。懂了以上這些,現(xiàn)在我們就有思路了,先decode,再encode。代碼如下:

​xxx.decode('unicode-escape').encode()

​最后的擴(kuò)展

還記得剛剛那個ord嗎。時代變遷,老大哥ASCII被人合并,但ord還是有用武之地。試試ord('中'),輸出結(jié)果是20013。20013是什么呢,我們再試試hex(ord('中')),輸出結(jié)果是'0x4e2d',也就是20013是我們在上文見面了無數(shù)次的x4e2d的十進(jìn)制值。這里說下hex,是用來轉(zhuǎn)換成十六進(jìn)制的函數(shù),學(xué)過單片機(jī)的人對hex肯定不會陌生。

最后的擴(kuò)展,在網(wǎng)上看到的他人的問題。我們寫下類似于'\u4e2d'的字符,Python3知道我們想表達(dá)什么。但是讓Python讀取某個文件的時候出現(xiàn)了'\u4e2d',是不是計(jì)算機(jī)就不認(rèn)識它了呢?后來下文有人給出了答案。如下:

import codecs

file = codecs.open( "a.txt", "r", "unicode-escape" )

u = file.read()

print(u)

相關(guān)文章

  • 在Pycharm的Project Files下建立多個項(xiàng)目的操作

    在Pycharm的Project Files下建立多個項(xiàng)目的操作

    這篇文章主要介紹了在Pycharm的Project Files下建立多個項(xiàng)目的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 利用 Python 實(shí)現(xiàn)多任務(wù)進(jìn)程

    利用 Python 實(shí)現(xiàn)多任務(wù)進(jìn)程

    這篇文章主要介紹如何利用 Python 實(shí)現(xiàn)多任務(wù)進(jìn)程,正在執(zhí)行的程序,由程序、數(shù)據(jù)和進(jìn)程控制塊組成,是正在執(zhí)行的程序,程序的一次執(zhí)行過程,是資源調(diào)度的基本單位。下面就來詳細(xì)介紹改內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • Python+Selenium實(shí)現(xiàn)表單自動填充和提交

    Python+Selenium實(shí)現(xiàn)表單自動填充和提交

    你是不是也厭倦了每天重復(fù)表單填寫的工作,是時候讓技術(shù)來幫助我們解放雙手了,下面小編就為大家介紹一下如何使用Selenium和Python來自動填充和提交表單
    2023-09-09
  • python使用鎖訪問共享變量實(shí)例解析

    python使用鎖訪問共享變量實(shí)例解析

    這篇文章主要介紹了python使用鎖訪問共享變量實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼

    Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼

    這篇文章主要介紹了Python qqbot 實(shí)現(xiàn)qq機(jī)器人的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python替換月份為英文縮寫的實(shí)現(xiàn)方法

    Python替換月份為英文縮寫的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Python替換月份為英文縮寫的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • win10安裝tensorflow-gpu1.8.0詳細(xì)完整步驟

    win10安裝tensorflow-gpu1.8.0詳細(xì)完整步驟

    這篇文章主要介紹了win10安裝tensorflow-gpu1.8.0詳細(xì)完整步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Python生成可執(zhí)行文件.exe操作完整流程記錄

    Python生成可執(zhí)行文件.exe操作完整流程記錄

    .exe是文件擴(kuò)展名,帶有.exe擴(kuò)展名的文件名按下Enter鍵就可運(yùn)行,這篇文章主要給大家介紹了關(guān)于Python生成可執(zhí)行文件.exe操作完整流程的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 關(guān)于matlab圖像濾波詳解(二維傅里葉濾波)

    關(guān)于matlab圖像濾波詳解(二維傅里葉濾波)

    這篇文章主要介紹了關(guān)于matlab圖像濾波詳解(二維傅里葉濾波),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python實(shí)現(xiàn)詞云圖詞頻統(tǒng)計(jì)

    Python實(shí)現(xiàn)詞云圖詞頻統(tǒng)計(jì)

    這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)分析中的詞頻統(tǒng)計(jì)和詞云圖可視化,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下
    2022-12-12

最新評論

贵溪市| 蒲城县| 江阴市| 二手房| 吉首市| 道真| 青浦区| 孝感市| 白城市| 乐业县| 礼泉县| 兴安县| 太白县| 高平市| 婺源县| 彝良县| 锡林郭勒盟| 德令哈市| 兴化市| 灵宝市| 即墨市| 吉水县| 东兰县| 黄山市| 凤台县| 秦皇岛市| 松江区| 祁门县| 华亭县| 鄱阳县| 普安县| 洮南市| 仪征市| 手机| 池州市| 临洮县| 长子县| 天津市| 富阳市| 临沭县| 普安县|