成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[零基礎(chǔ)學(xué)Python]坑爹的字符編碼

rozbo / 2650人閱讀

摘要:所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問題。在這個(gè)世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬個(gè)字符第十萬個(gè)字符在年獲采納。涵蓋的數(shù)據(jù)除了視覺上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。

字符編碼,在編程中,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,比如一個(gè)str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問題。

>>> name = "老齊"
>>> name
"xe8x80x81xe9xbdx90"

在你的編程中,你遇到過上面的情形嗎?認(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)攻呢?)。

鼓聲在空氣中傳播,比傳令員的嗓子吼出來的聲音傳播的更遠(yuǎn),士兵聽到后也不會引起歧義,一般不會有士兵把鼓聲當(dāng)做打呼嚕的聲音。這就是“進(jìn)攻”命令被編碼成鼓聲之后的優(yōu)勢所在。

士兵聽到鼓聲,就是接收到信息之后,如果接受過訓(xùn)練或者有人告訴過他們,他們就知道這是讓我進(jìn)攻。這個(gè)過程就是解碼。所以,編碼方案要有兩套。一套在信息發(fā)出者那里,另外一套在信息接受者這里。經(jīng)過解碼之后,士兵明白了,才行動。

以上過程比較簡單。其實(shí),真實(shí)的編碼和解碼過程,要復(fù)雜了。不過,原理都差不多的。

舉一個(gè)似乎遙遠(yuǎn),其實(shí)不久前人們都在使用的東西做例子:電報(bào)

  

電報(bào)是通信業(yè)務(wù)的一種,在19世紀(jì)初發(fā)明,是最早使用電進(jìn)行通信的方法。電報(bào)大為加快了消息的流通,是工業(yè)社會的其中一項(xiàng)重要發(fā)明。早期的電報(bào)只能在陸地上通訊,后來使用了海底電纜,開展了越洋服務(wù)。到了20世紀(jì)初,開始使用無線電撥發(fā)電報(bào),電報(bào)業(yè)務(wù)基本上已能抵達(dá)地球上大部份地區(qū)。電報(bào)主要是用作傳遞文字訊息,使用電報(bào)技術(shù)用作傳送圖片稱為傳真。

  

中國首條出現(xiàn)電報(bào)線路是1871年,由英國、俄國及丹麥敷設(shè),從香港經(jīng)上海至日本長崎的海底電纜。由于清政府的反對,電纜被禁止在上海登陸。后來丹麥公司不理清政府的禁令,將線路引至上海公共租界,并在6月3日起開始收發(fā)電報(bào)。至于首條自主敷設(shè)的線路,是由福建巡撫丁日昌在臺灣所建,1877年10月完工,連接臺南及高雄。1879年,北洋大臣李鴻章在天津、大沽及北塘之間架設(shè)電報(bào)線路,用作軍事通訊。1880年,李鴻章奏準(zhǔn)開辦電報(bào)總局,由盛宣懷任總辦。并在1881年12月開通天津至上海的電報(bào)服務(wù)。李鴻章説:“五年來,我國創(chuàng)設(shè)沿江沿海各省電線,總計(jì)一萬多里,國家所費(fèi)無多,巨款來自民間。當(dāng)時(shí)正值法人挑釁,將帥報(bào)告軍情,朝廷傳達(dá)指示,均相機(jī)而動,無絲毫阻礙。中國自古用兵,從未如此神速。出使大臣往來問答,朝發(fā)夕至,相隔萬里好似同居庭院。舉設(shè)電報(bào)一舉三得,既防止外敵侵略,又加強(qiáng)國防,亦有利于商務(wù)?!碧旖蚬匐娋钟诟釉鈦y全毀。1887年,臺灣巡撫劉銘傳敷設(shè)了福州至臺灣的海底電纜,是中國首條海底電纜。1884年,北京電報(bào)開始建設(shè),采用"安設(shè)雙線,由通州展至京城,以一端引入署中,專遞官信,以一端擇地安置用便商民",同年8月5日,電報(bào)線路開始建設(shè),所有電線桿一律漆成紅色。8月22日,位于北京崇文門外大街西的喜鵲胡同的外城商用電報(bào)局開業(yè)。同年8月30日,位于崇文門內(nèi)泡子和以西的呂公堂開局,專門收發(fā)官方電報(bào)。

  

為了傳達(dá)漢字,電報(bào)部門準(zhǔn)備由4位數(shù)字或3位羅馬字構(gòu)成的代碼,即中文電碼,采用發(fā)送前將漢字改寫成電碼發(fā)出,收電報(bào)后再將電碼改寫成漢字的方法。

列位看官注意了,這里出現(xiàn)了電報(bào)中用的“中文電碼”,這就是一種編碼,將漢字對應(yīng)成阿拉伯?dāng)?shù)字,從而能夠用電報(bào)發(fā)送漢字。

  

1873年,法國駐華人員威基杰參照《康熙字典》的部首排列方法,挑選了常用漢字6800多個(gè),編成了第一部漢字電碼本《電報(bào)新書》。

電報(bào)中的編碼被稱為摩爾斯電碼,英文是Morse Code

  

摩爾斯電碼(英語:Morse Code)是一種時(shí)通時(shí)斷的信號代碼,通過不同的排列順序來表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號。是由美國人薩繆爾·摩爾斯在1836年發(fā)明。

  

摩爾斯電碼是一種早期的數(shù)字化通信形式,但是它不同于現(xiàn)代只使用0和1兩種狀態(tài)的二進(jìn)制代碼,它的代碼包括五種:點(diǎn)(.)、劃(-)、每個(gè)字符間短的停頓(在點(diǎn)和劃之間的停頓)、每個(gè)詞之間中等的停頓、以及句子之間長的停頓

看來電報(bào)員是一個(gè)技術(shù)活,不同長短的停頓都代表了不同意思。哦,對了,有一個(gè)老片子《永不消逝的電波》,看完之后保證你才知道,里面根本就沒有講電報(bào)是怎么編碼的。

  

摩爾斯電碼在海事通訊中被作為國際標(biāo)準(zhǔn)一直使用到1999年。1997年,當(dāng)法國海軍停止使用摩爾斯電碼時(shí),發(fā)送的最后一條消息是:“所有人注意,這是我們在永遠(yuǎn)沉寂之前最后的一聲吶喊!”

我瞪著眼看了老長時(shí)間,這兩行不是一樣的嗎?

不管這個(gè)了,總之,這就是編碼。

計(jì)算機(jī)中的字符編碼

先抄一段維基百科對字符編碼的解釋:

  

字符編碼(英語:Character encoding)、字集碼是把字符集中的字符編碼為指定集合中某一對象(例如:比特模式、自然數(shù)串行、8位組或者電脈沖),以便文本在計(jì)算機(jī)中存儲和通過通信網(wǎng)絡(luò)的傳遞。常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII。其中,ASCII將字母、數(shù)字和其它符號編號,并用7比特的二進(jìn)制來表示這個(gè)整數(shù)。通常會額外使用一個(gè)擴(kuò)充的比特,以便于以1個(gè)字節(jié)的方式存儲。

  

在計(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取代。

上面的引文中已經(jīng)說了,現(xiàn)在我們用的編碼標(biāo)準(zhǔn),已經(jīng)不是ASCII了,我上大學(xué)那時(shí)候老師講的還是ASCII呢(最坑爹的是貴國的大學(xué)教育,前幾天面試一個(gè)大學(xué)畢業(yè)生,計(jì)算機(jī)專業(yè)的,他告訴我他的老師給他們講的就是ASCII為編碼標(biāo)準(zhǔn)呢,我說你別埋汰老師了,你去看看教材,今天這哥們真給我發(fā)短信了,告訴我教材上就是這么說的。),時(shí)代變遷,現(xiàn)在已經(jīng)變成了Unicode了,那么什么是Unicode編碼呢?還是抄一段來自維基百科的說明(需要說明一下,本講不是我qiwsir在講,是維基百科在講,我只是一個(gè)配角,哈哈)

  

Unicode(中文:萬國碼、國際碼、統(tǒng)一碼、單一碼)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn)。它對世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,使得電腦可以用更為簡單的方式來呈現(xiàn)和處理文字。

  

Unicode伴隨著通用字符集的標(biāo)準(zhǔn)而發(fā)展,同時(shí)也以書本的形式對外發(fā)表。Unicode至今仍在不斷增修,每個(gè)新版本都加入更多新的字符。目前最新的版本為7.0.0,已收入超過十萬個(gè)字符(第十萬個(gè)字符在2005年獲采納)。Unicode涵蓋的數(shù)據(jù)除了視覺上的字形、編碼方法、標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。

聽這名字:萬國碼,那就一定包含了中文嘍。的確是。但是,光有一個(gè)Unicode還不行,因?yàn)?...(此處省略若干字,看官可以到上面給出的維基百科連接中看),還要有其它的一些編碼實(shí)現(xiàn)方式,Unicode的實(shí)現(xiàn)方式稱為Unicode轉(zhuǎn)換格式(Unicode Transformation Format,簡稱為UTF),于是乎有了一個(gè)我們在很多時(shí)候都會看到的utf-8。

什么是utf-8,還是看維基百科上怎么說的吧

  

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符,且其編碼中的第一個(gè)字節(jié)仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部份修改,即可繼續(xù)使用。因此,它逐漸成為電子郵件、網(wǎng)頁及其他存儲或發(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.
codecs.decode(obj[, encoding[, errors]]):Decodes obj using the codec registered for encoding.

python2默認(rèn)的編碼是ascii,通過encode可以將對象的編碼轉(zhuǎn)換為指定編碼格式,而decode是這個(gè)過程的逆過程。

做一個(gè)實(shí)驗(yàn),才能理解:

>>> a = "中"
>>> type(a)

>>> a
"xe4xb8xad"
>>> len(a)
3

>>> b = a.decode()
>>> b
u"u4e2d"
>>> type(b)

>>> len(b)
1

這個(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)?strong>字符串,并且這個(gè)字符串是按照unicode編碼的。在unicode編碼中,一個(gè)漢字對應(yīng)一個(gè)字符,這時(shí)候度量它的長度就是1.

反過來,一個(gè)unicode編碼的字符串,也可以轉(zhuǎn)換為字節(jié)串。

>>> c = b.encode("utf-8")
>>> c
"xe4xb8xad"
>>> type(c)

>>> c == a
True

關(guān)于編碼問題,先到這里,點(diǎn)到為止吧。因?yàn)樵俪?,還會扯出問題來??垂倏隙ǜ械讲粷M意,因?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 -*-

有朋友問我-*-有什么作用,那個(gè)就是為了好看,愛美之心人皆有,更何況程序員?當(dāng)然,也可以寫成:

# coding:utf-8

經(jīng)驗(yàn)二:遇到字符(節(jié))串,立刻轉(zhuǎn)化為unicode,不要用str(),直接使用unicode()

unicode_str = unicode("中文", encoding="utf-8")
print unicode_str.encode("utf-8")

經(jīng)驗(yàn)三:如果對文件操作,打開文件的時(shí)候,最好用codecs.open,替代open(這個(gè)后面會講到,先放在這里)

import codecs
codecs.open("filename", encoding="utf8")

我還收集了網(wǎng)上的一片文章,也挺好的,推薦給看官:Python2.x的中文顯示方法

最后告訴給我,如果用python3,坑爹的編碼問題就不煩惱了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37335.html

相關(guān)文章

  • [基礎(chǔ)學(xué)python]玩轉(zhuǎn)字符串(1)

    摘要:操練一下字符串吧。它是在告訴計(jì)算機(jī),它里面包裹著的是一個(gè)字符串。連接字符串方法在中按照下面方法操作老齊教老齊教這是一種最簡單連接兩個(gè)字符串的方法。請看官字符編碼就知道了。 如果對自然語言分類,有很多中分法,比如英語、法語、漢語等,這種分法是最常見的。在語言學(xué)里面,也有對語言的分類方法,比如什么什么語系之類的。我這里提出一種分法,這種分法尚未得到廣大人民群眾和研究者的廣泛認(rèn)同,但是,我相...

    eechen 評論0 收藏0
  • [基礎(chǔ)學(xué)python]用Python操作數(shù)據(jù)庫(3)

    摘要:用選擇要操作的數(shù)據(jù)庫,然后通過指針就可以操作這個(gè)數(shù)據(jù)庫了。這樣就在這個(gè)數(shù)據(jù)庫中創(chuàng)建了一個(gè)名為的表這是查看表的方式。樹欲靜而風(fēng)不止,小偷在行動。所以,要特別提醒諸位注意。 通過python操作數(shù)據(jù)庫的行為,除了能夠完成前面兩講中的操作之外(當(dāng)然,那是比較常用的),其實(shí)任何對數(shù)據(jù)庫進(jìn)行的操作,都能夠通過python-mysqldb來實(shí)現(xiàn)。 建立數(shù)據(jù)庫 在《用python操作數(shù)據(jù)庫(1)...

    BDEEFE 評論0 收藏0
  • 爹的三角形導(dǎo)航實(shí)現(xiàn)思路

    摘要:使用監(jiān)聽中的元素的與事件,然后在中顯示第二層中相同索引的元素,從而實(shí)現(xiàn)高亮,事件用于清除高亮 坑爹的三角形導(dǎo)航終于制作完成了,下面分享一下思路,先看最終效果:http://mall.juesheng.com/act/butie3showImg(https://segmentfault.com/img/bVkFK9); 基本思路:使用古老的 Image Mapping 技術(shù),在圖片上定義...

    leap_frog 評論0 收藏0
  • 爹的三角形導(dǎo)航實(shí)現(xiàn)思路

    摘要:使用監(jiān)聽中的元素的與事件,然后在中顯示第二層中相同索引的元素,從而實(shí)現(xiàn)高亮,事件用于清除高亮 坑爹的三角形導(dǎo)航終于制作完成了,下面分享一下思路,先看最終效果:http://mall.juesheng.com/act/butie3showImg(https://segmentfault.com/img/bVkFK9); 基本思路:使用古老的 Image Mapping 技術(shù),在圖片上定義...

    mingde 評論0 收藏0
  • 一次搞清楚移動端適配這幾個(gè)爹的單位慨念

    摘要:真的是給我們新手學(xué)習(xí)移動端適配造成不少困惑英語真的很重要呀。細(xì)節(jié)高清屏上的處理其實(shí)并不是所有做移動端適配的人都一定會遇到這個(gè)問題。 一次搞清楚移動端這幾個(gè)坑爹的單位慨念 目錄: 一、讓坑爹的單位,不再坑爹 二、需要準(zhǔn)備什么樣的設(shè)計(jì)稿 三、rem方案的原理和細(xì)節(jié) 高清屏上,位圖的處理 高清屏上,關(guān)于border: 1px的處理 移動端屏幕的自動適配的處理 移動端屏幕上字體大小的處理...

    objc94 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<