九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
不可不知的Python字符編碼使用技巧(上)

Python語(yǔ)言在網(wǎng)絡(luò)爬蟲(chóng)領(lǐng)域應(yīng)用的十分廣泛。在爬蟲(chóng)的應(yīng)用程序中,我們需要對(duì)網(wǎng)頁(yè)上獲取的數(shù)據(jù)進(jìn)行處理,其中字符的編碼、解碼常常讓人感到困惑:ASCII碼、Unicode、字符編碼什么的,很多朋友一直為此頭大,那么,我們就分上、下兩集來(lái)專(zhuān)門(mén)深入剖析這些內(nèi)容。

先開(kāi)始我們不講編程,不堆概念,我們講講故事:說(shuō)說(shuō)字符編碼是如何變成今天這樣的

關(guān)于字符編碼的概念太多太雜,當(dāng)ASCII、GB2312、Unicode、UTF-8、UTF-16、編碼、解碼等諸多名詞一股腦堆上來(lái)時(shí),確實(shí)容易讓人迷糊。

為了把這些問(wèn)題講清楚,我們從歷史維度,在時(shí)間軸上梳理計(jì)算機(jī)在不同語(yǔ)言國(guó)家不斷發(fā)展的過(guò)程,以此來(lái)徹底搞清楚這些概念。

1.字符編碼與解碼是什么

計(jì)算機(jī)自己能理解的“語(yǔ)言”是二進(jìn)制數(shù),最小的信息標(biāo)識(shí)是二進(jìn)制位,8個(gè)二進(jìn)制位表示一個(gè)字節(jié);而我們?nèi)祟?lèi)所能理解的語(yǔ)言文字則是一套由英文字母、漢語(yǔ)漢字、標(biāo)點(diǎn)符號(hào)字符、阿拉伯?dāng)?shù)字等等很多的字符構(gòu)成的字符集。如果要讓計(jì)算機(jī)來(lái)按照人類(lèi)的意愿進(jìn)行工作,則必須把人類(lèi)所使用的這些字符集轉(zhuǎn)換為計(jì)算機(jī)所能理解的二級(jí)制碼,這個(gè)過(guò)程就是編碼,他的逆過(guò)程稱(chēng)為解碼。

2.ASCII到Unicode的演進(jìn)過(guò)程

計(jì)算機(jī)最開(kāi)始在美國(guó)被發(fā)明使用,需要編碼的字符集并不是很大,無(wú)外乎英文字母、數(shù)字和一些簡(jiǎn)單的標(biāo)點(diǎn)符號(hào),因此采用了一種單字節(jié)編碼系統(tǒng)。在這套編碼規(guī)則中,人們將所需字符集中的字符一一映射到128個(gè)二進(jìn)制數(shù)上,這128個(gè)二進(jìn)制數(shù)最高位為0,利用剩余低7位組成00000000~01111111(0X00~0X7F)。

0X00到0X1F這32個(gè)二進(jìn)制數(shù)來(lái)對(duì)控制字符或通信專(zhuān)用字符(如LF換行、DEL刪除、BS退格)進(jìn)行編碼,0X20到0X7F共96個(gè)二進(jìn)制數(shù)用來(lái)對(duì)阿拉伯?dāng)?shù)字、英文字母大小寫(xiě)和下劃線(xiàn)、括號(hào)等符號(hào)進(jìn)行編碼。將這套字符集映射到0X00~0X7F二進(jìn)制碼的過(guò)程就稱(chēng)為基礎(chǔ)ASCII編碼,通過(guò)這個(gè)編碼過(guò)程,計(jì)算機(jī)就將人類(lèi)的語(yǔ)言轉(zhuǎn)化為自己的語(yǔ)言存儲(chǔ)起來(lái);反之,從磁盤(pán)中讀取二級(jí)制數(shù)并轉(zhuǎn)化為字母數(shù)字等字符以供顯示的過(guò)程就是解碼了。

隨著計(jì)算機(jī)被迅速推廣使用,歐洲非英語(yǔ)國(guó)家的人們發(fā)現(xiàn)這套由美國(guó)人設(shè)計(jì)的字符集不夠用了,比如一些帶重音的字符、希臘字母等都不在這個(gè)字符集中,于是擴(kuò)充了ASCII編碼規(guī)則,將原本為0的最高位改為1,因此擴(kuò)展出了10000000~11111111(0X80~0XFF)這128個(gè)二進(jìn)制數(shù)。這其中,最優(yōu)秀的擴(kuò)展方案是ISO 8859-1,通常稱(chēng)之為L(zhǎng)atin-1。Latin-1利用128~255這128個(gè)二進(jìn)制數(shù),包括了足夠的附加字符集來(lái)涵蓋基本的西歐語(yǔ)言,同時(shí)在0~127的范圍內(nèi)兼容ASCII編碼規(guī)則。

隨著使用計(jì)算機(jī)的國(guó)家越來(lái)越多,自然而然需要編碼的字符集就越來(lái)越龐大,早先的ASCII編碼字符集由于受到單字節(jié)的限制,其容量就遠(yuǎn)遠(yuǎn)不夠了,比方說(shuō)面對(duì)成千上萬(wàn)的漢字,其壓力可想而知。因此中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布了一套《信息交換用漢字編碼字符集》的國(guó)家標(biāo)準(zhǔn),其標(biāo)準(zhǔn)號(hào)就是GB 2312—1980。這個(gè)字符集共收入漢字6763個(gè)和非漢字圖形字符682個(gè),采用兩個(gè)字節(jié)對(duì)字符集進(jìn)行編碼,并向下兼容ASCII編碼方式。簡(jiǎn)言之,整個(gè)字符集分成94個(gè)區(qū),每區(qū)有94個(gè)位,分別用一個(gè)字節(jié)對(duì)應(yīng)表示相應(yīng)的區(qū)和位。每個(gè)區(qū)位對(duì)應(yīng)一個(gè)字符,因此可用所在的區(qū)和位來(lái)對(duì)漢字進(jìn)行兩字節(jié)編碼。再后來(lái)生僻字、繁體字及日韓漢字也被納入字符集,就又有了后來(lái)的GBK字符集及相應(yīng)的編碼規(guī)范,GBK編碼規(guī)范也是向下兼容GBK2312的。

在中國(guó)發(fā)展的同時(shí),計(jì)算機(jī)在全世界各個(gè)國(guó)家不斷普及,不同的國(guó)家地區(qū)都會(huì)開(kāi)發(fā)出自己的一套編碼系統(tǒng),因此編碼系統(tǒng)五花八門(mén),這時(shí)候問(wèn)題就開(kāi)始凸顯了,特別是在互聯(lián)網(wǎng)通信的大環(huán)境下,裝有不同編碼系統(tǒng)的計(jì)算機(jī)之間通信就會(huì)彼此不知道對(duì)方在“說(shuō)”些什么,按照A編碼系統(tǒng)的編碼方式將所需字符轉(zhuǎn)換成二進(jìn)制碼后,在B編碼系統(tǒng)的計(jì)算機(jī)上解碼是無(wú)法得到原始字符的,相反會(huì)出現(xiàn)一些出人意料的古怪字符,這就是所謂的亂碼。

那么統(tǒng)一字符編碼的需求就迫切擺在了大家眼前,為了實(shí)現(xiàn)跨語(yǔ)言、跨平臺(tái)的文本轉(zhuǎn)換和處理需求,ISO國(guó)際標(biāo)準(zhǔn)化組織提出了Unicode的新標(biāo)準(zhǔn),這套標(biāo)準(zhǔn)中包含了Unicode字符集和一套編碼規(guī)范。Unicode字符集涵蓋了世界上所有的文字和符號(hào)字符,Unicode編碼方案為字符集中的每一個(gè)字符指定了統(tǒng)一且唯一的二進(jìn)制編碼,這就能徹底解決之前不同編碼系統(tǒng)的沖突和亂碼問(wèn)題。這套編碼方案簡(jiǎn)單來(lái)說(shuō)是這樣的:編碼規(guī)范中含有17個(gè)組(稱(chēng)為平面),每一個(gè)組含有65536個(gè)碼位(例如組0就是0X0000~0XFFFF),每一個(gè)碼位就唯一對(duì)應(yīng)一個(gè)字符,大部分的字符都位于字符集平面0的碼位中,少量位于其他平面。

3.字符編碼和字符代碼的概念區(qū)分

既然提到了Unicode編碼,那么常常與之相伴的UTF-8,UTF-16編碼方案又是什么?其實(shí)到目前為止我們都一直混淆了兩個(gè)概念,即字符代碼和字符編碼,字符代碼是特定字符在某個(gè)字符集中的序號(hào),而字符編碼是在傳輸、存儲(chǔ)過(guò)程當(dāng)中用于表示字符的以字節(jié)為單位的二進(jìn)制序列。ASCII編碼系統(tǒng)中,字符代碼和字符編碼是一致的,比如字符A,在ASCII字符集中的序號(hào),也就是所謂的字符代碼是65,存儲(chǔ)在磁盤(pán)中的二進(jìn)制比特序列是01000001(0X41,十進(jìn)制也是65),另外的,如在GB2312編碼系統(tǒng)中字符代碼和字符編碼的值也是一致的,所以無(wú)形之中我們就忽略了二者的差異性。

而在Unicode標(biāo)準(zhǔn)中,我們目前使用的是UCS-4,即字符集中每一個(gè)字符的字符代碼都是用4個(gè)字節(jié)來(lái)表示的,其中字符代碼0~127兼容ASCII字符集,一般的通用漢字的字符代碼也都集中在65535之前,使用大于65535的字符代碼,即需要超過(guò)兩個(gè)字節(jié)來(lái)表示的字符代碼是比較少的。因此,如果仍然依舊采用字符代碼和字符編碼相一致的編碼方式,那么英語(yǔ)字母、數(shù)字原本僅需一個(gè)字節(jié)編碼,目前就需要4個(gè)字節(jié)進(jìn)行編碼,漢字原本僅需兩個(gè)字節(jié)進(jìn)行編碼,目前也需要4個(gè)字節(jié)進(jìn)行編碼,這對(duì)于存儲(chǔ)或傳輸資源而言是很不劃算的。

因此就需要在字符代碼和字符編碼間進(jìn)行再編碼,這樣就引出了UTF-8、UTF-16等編碼方式?;谏鲜鲂枨?,UTF-8就是針對(duì)位于不同范圍的字符代碼轉(zhuǎn)化成不同長(zhǎng)度的字符編碼,同時(shí)這種編碼方式是以字節(jié)為單位,并且完全兼容ASCII編碼,即0X00-0X7F的字符代碼和字符編碼完全一致,也是用一個(gè)字節(jié)來(lái)編碼ASCII字符集,而常用漢字在Unicode中的字符代碼是4E00-9FA5,在文末的對(duì)應(yīng)關(guān)系中我們看到是用三個(gè)字節(jié)來(lái)進(jìn)行漢字字符的編碼。UTF-16同理,就是以16位二進(jìn)制數(shù)為基本單位對(duì)Unicode字符集中的字符代碼進(jìn)行再編碼,原理和UTF-8一致。

因此,我們可以看出,在目前全球互聯(lián)的大背景下,Unicode字符集和編碼方式解決了跨語(yǔ)言、跨平臺(tái)的交流問(wèn)題,同時(shí)UTF-8等編碼方式又有效的節(jié)約了存儲(chǔ)空間和傳輸帶寬,因而受到了極大的推廣應(yīng)用。

我想,通過(guò)講清楚字符編碼的發(fā)展歷史,容易讓人明白為什么某一時(shí)刻就出現(xiàn)了某種編碼方式,搞清楚了來(lái)龍去脈,對(duì)字符編碼就好理解了。

那么在下集里,我們會(huì)再介紹python中字符編碼、解碼的具體編程技巧,我們下期再見(jiàn),bye~

附表:Unicode字符代碼與UTF-8編碼的對(duì)應(yīng)關(guān)系

0000 0000-0000 007| 0xxxxxxx

0000 0080-0000 07FF |
 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF |
 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
編碼又見(jiàn)編碼
第四章 python3 語(yǔ)法基礎(chǔ)之字符集編碼格式
字符集與字符集編碼簡(jiǎn)介
關(guān)于unicode,mbcs,utf8,charset,encoding等相關(guān)概念的說(shuō)明
ANSI、ASCII、Unicode和UTF
讓VIM徹底告別亂碼
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服