字符編碼,在編程中,,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,,比如一個(gè)str,如果都是英文,,好說多了,。但恰恰不是如此,中文是我們不得不用的,。所以,,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問題,。 >>> name = '老齊'
>>> name
'\xe8\x80\x81\xe9\xbd\x90'
在你的編程中,,你遇到過上面的情形嗎?認(rèn)識最下面一行打印出來的東西嗎,?看人家英文,,就好多了 >>> name = 'qiwsir'
>>> name
'qiwsir'
難道這是中文的錯(cuò)嗎?看來投胎真的是一個(gè)技術(shù)活,。是的,,投胎是技術(shù)活,但上面的問題不是中文的錯(cuò),。 編碼 什么是編碼,?這是一個(gè)比較玄乎的問題。也不好下一個(gè)普通定義,。我看到有的教材中有定義,,不敢說他的定義不對,至少可以說不容易理解,。 古代打仗,,擊鼓進(jìn)攻、鳴金收兵,,這就是編碼,。吧要傳達(dá)給士兵的命令對應(yīng)為一定的其它形式,比如命令“進(jìn)攻”,,經(jīng)過如此的信息傳遞: 長官下達(dá)進(jìn)攻命令,,傳令員將這個(gè)命令編碼為鼓聲(如果復(fù)雜點(diǎn),是不是有幾聲鼓響,,如何進(jìn)攻呢,?)。 舉一個(gè)似乎遙遠(yuǎn),其實(shí)不久前人們都在使用的東西做例子:電報(bào) 復(fù)制代碼 代碼如下:
電報(bào)是通信業(yè)務(wù)的一種,,在19世紀(jì)初發(fā)明,,是最早使用電進(jìn)行通信的方法。電報(bào)大為加快了消息的流通,,是工業(yè)社會(huì)的其中一項(xiàng)重要發(fā)明,。早期的電報(bào)只能在陸地上通訊,后來使用了海底電纜,,開展了越洋服務(wù),。到了20世紀(jì)初,開始使用無線電撥發(fā)電報(bào),,電報(bào)業(yè)務(wù)基本上已能抵達(dá)地球上大部份地區(qū),。電報(bào)主要是用作傳遞文字訊息,使用電報(bào)技術(shù)用作傳送圖片稱為傳真,。 1873年,法國駐華人員威基杰參照《康熙字典》的部首排列方法,挑選了常用漢字6800多個(gè),編成了第一部漢字電碼本《電報(bào)新書》,。 摩爾斯電碼(英語:Morse Code)是一種時(shí)通時(shí)斷的信號代碼,,通過不同的排列順序來表達(dá)不同的英文字母,、數(shù)字和標(biāo)點(diǎn)符號。是由美國人薩繆爾·摩爾斯在1836年發(fā)明,。 摩爾斯電碼在海事通訊中被作為國際標(biāo)準(zhǔn)一直使用到1999年,。1997年,當(dāng)法國海軍停止使用摩爾斯電碼時(shí),,發(fā)送的最后一條消息是:“所有人注意,,這是我們在永遠(yuǎn)沉寂之前最后的一聲吶喊!”
不管這個(gè)了,總之,,這就是編碼,。 計(jì)算機(jī)中的字符編碼 先抄一段維基百科對字符編碼的解釋: 復(fù)制代碼 代碼如下: 字符編碼(英語:Character encoding)、字集碼是把字符集中的字符編碼為指定集合中某一對象(例如:比特模式,、自然數(shù)串行,、8位組或者電脈沖),以便文本在計(jì)算機(jī)中存儲(chǔ)和通過通信網(wǎng)絡(luò)的傳遞,。常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII,。其中,ASCII將字母,、數(shù)字和其它符號編號,,并用7比特的二進(jìn)制來表示這個(gè)整數(shù)。通常會(huì)額外使用一個(gè)擴(kuò)充的比特,,以便于以1個(gè)字節(jié)的方式存儲(chǔ),。 在計(jì)算機(jī)技術(shù)發(fā)展的早期,如ASCII(1963年)和EBCDIC(1964年)這樣的字符集逐漸成為標(biāo)準(zhǔn),。但這些字符集的局限很快就變得明顯,,于是人們開發(fā)了許多方法來擴(kuò)展它們。對于支持包括東亞CJK字符家族在內(nèi)的寫作系統(tǒng)的要求能支持更大量的字符,,并且需要一種系統(tǒng)而不是臨時(shí)的方法實(shí)現(xiàn)這些字符的編碼,。 在這個(gè)世界上,有好多不同的字符編碼,。但是,,它們不是自己隨便搞搞的,。而是要有一定的基礎(chǔ),往往是以名叫ASCII的編碼為基礎(chǔ),,這里邊也應(yīng)該包括北朝鮮吧(不知道他們用什么字符編碼,,瞎想的,別當(dāng)真,,不代表本教材立場,,只代表瞎想)。
ASCII(pronunciation: 英語發(fā)音:/??ski/ ASS-kee1,,American Standard Code for Information Interchange,,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語,,而其擴(kuò)展版本EASCII則可以部分支持其他西歐語言,,并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。由于萬維網(wǎng)使得ASCII廣為通用,,直到2007年12月,,逐漸被Unicode取代。 Unicode(中文:萬國碼、國際碼,、統(tǒng)一碼,、單一碼)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),。它對世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,,使得電腦可以用更為簡單的方式來呈現(xiàn)和處理文字,。 聽這名字:萬國碼,那就一定包含了中文嘍,。的確是,。但是,光有一個(gè)Unicode還不行,,因?yàn)?...(此處省略若干字,,看官可以到上面給出的維基百科連接中看),還要有其它的一些編碼實(shí)現(xiàn)方式,,Unicode的實(shí)現(xiàn)方式稱為Unicode轉(zhuǎn)換格式(Unicode Transformation Format,,簡稱為UTF),于是乎有了一個(gè)我們在很多時(shí)候都會(huì)看到的utf-8,。
什么是utf-8,,還是看維基百科上怎么說的吧 復(fù)制代碼 代碼如下: UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼,。它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符,,且其編碼中的第一個(gè)字節(jié)仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部份修改,,即可繼續(xù)使用,。因此,它逐漸成為電子郵件,、網(wǎng)頁及其他存儲(chǔ)或發(fā)送文字的應(yīng)用中,,優(yōu)先采用的編碼。 不再多引用了,,如果要看更多,,請到原文,。
看官現(xiàn)在是不是就理解了,前面寫程序的時(shí)候,,曾經(jīng)出現(xiàn)過:coding:utf-8的字樣,。就是在告訴python我們要用什么字符編碼呢。 encode和decode 歷史部分說完了,,接下怎么講,?比較麻煩了,。因?yàn)椴还茉趺粗v,,都不是三言兩語說清楚的,。姑且從encode()和decode()兩個(gè)內(nèi)置函數(shù)起吧,。 codecs.encode(obj[, encoding[, errors]]):Encodes obj using the codec registered for encoding. 做一個(gè)實(shí)驗(yàn),,才能理解: 復(fù)制代碼 代碼如下: >>> a = '中' >>> type(a) <type 'str'> >>> a '\xe4\xb8\xad' >>> len(a) 3
>>> b = a.decode() 這個(gè)實(shí)驗(yàn)不做之前,,或許看官還不是很迷茫(因?yàn)椴恢溃赖脑蕉嘣矫悦#?,?shí)驗(yàn)做完了,,自己也迷茫了。別急躁,,對編碼問題的理解,,要慢慢來,如果一時(shí)理解不了,,也肯定理解不了,,就先注意按照要求做,做著做著就豁然開朗了,。
上面試驗(yàn)中,,變量a引用了一個(gè)字符串,所謂字符串(str),,嚴(yán)格地將是字節(jié)串,它是經(jīng)過編碼后的字節(jié)組成的序列。也就是你在上面的實(shí)驗(yàn)中,,看到的是“中”這個(gè)字在計(jì)算機(jī)中編碼之后的字節(jié)表示。(關(guān)于字節(jié),,看官可以google一下),。用len(a)來度量它的長度,它是由三個(gè)字節(jié)組成的,。 然后通過decode函數(shù),,將字節(jié)串轉(zhuǎn)變?yōu)樽址⑶疫@個(gè)字符串是按照unicode編碼的,。在unicode編碼中,,一個(gè)漢字對應(yīng)一個(gè)字符,這時(shí)候度量它的長度就是1. 反過來,,一個(gè)unicode編碼的字符串,,也可以轉(zhuǎn)換為字節(jié)串。 復(fù)制代碼 代碼如下: >>> c = b.encode('utf-8') >>> c '\xe4\xb8\xad' >>> type(c) <type 'str'> >>> c == a True 關(guān)于編碼問題,,先到這里,,點(diǎn)到為止吧。因?yàn)樵俪?,還會(huì)扯出問題來,。看官肯定感到不滿意,,因?yàn)檫€沒有知其所以然,。沒關(guān)系,請盡情google,,即可解決,。
python中如何避免中文是亂碼 這個(gè)問題是一個(gè)具有很強(qiáng)操作性的問題。我這里有一個(gè)經(jīng)驗(yàn)總結(jié),,分享一下,,供參考: 首先,提倡使用utf-8編碼方案,,因?yàn)樗缙脚_不錯(cuò),。 經(jīng)驗(yàn)一:在開頭聲明: # -*- coding: utf-8 -*- # coding:utf-8 unicode_str = unicode('中文', encoding='utf-8') import codecs 最后告訴給我,,如果用python3,,坑爹的編碼問題就不煩惱了。 |
|