編碼問題

1. 輸出結(jié)果是16進(jìn)制---不太懂,來自百度---原網(wǎng)址
import re
#思路就是,把十六進(jìn)制字符串單獨(dú)提取出來,傳遞給chr函數(shù),返回Unicode字符.
pat=re.compile(r'\\u([\dabcdef]{4})')
s=r"\u56db\u5ddd\u5185\u6c5f"
print ''.join(map(chr,[eval('0x%s'%c) for c in re.findall(pat,s)]))
2. json格式
s = '{"province": "\\u56db\\u5ddd", "city": "\\u6210\\u90fd"}'
json.loads(s)

輸出結(jié)果如下:
{'city': '成都', 'province': '四川'}

3. 例子--環(huán)境為python2.7--來自微信

問題1: 問題在哪里

s = "中國(guó)zg"
e  = s.encode("utf-8")

問題2: Why?
過程:
第一句:操作系統(tǒng)使用自己的默認(rèn)編碼方式,將中國(guó)zg進(jìn)行了編碼,并把編碼后的01串給了程序
第二句:將字符串s用utf-8進(jìn)行編碼诡挂,并將編碼后的字符串賦值給e

問題來了,程序現(xiàn)在知道s中的01串受啥,還知道這個(gè)01串表示的是字符串躲履,但這個(gè)字符串的編碼是什么呢?操作系統(tǒng)只給程序傳來了01串淤井,并沒有告訴程序這個(gè)01串用的字符編碼是什么布疼。

此時(shí),python程序就會(huì)用它自己默認(rèn)的編碼當(dāng)作s的編碼币狠,進(jìn)而來識(shí)別s中的內(nèi)容游两。這個(gè)默認(rèn)的編碼是ASCII,所以漩绵,它會(huì)用ASCII來解釋這個(gè)01串贱案,識(shí)別出字符串的內(nèi)容,再將這個(gè)字符串轉(zhuǎn)為utf-8編碼止吐。

好了宝踪,程序碰到的第一個(gè)字節(jié)就是E4(11100101 ),傻眼碍扔! ASCII編碼中沒有這玩意兒啊瘩燥。ASCII編碼中字節(jié)第一位都是0啊。

怎么辦蕴忆?
報(bào)錯(cuò)唄颤芬,于是我們就看到了上面的錯(cuò)誤。
錯(cuò)誤中的0xe4就是字符 中 的utf8編碼的第一個(gè)字節(jié)

問題3:How套鹅?
??顯然站蝠,我們只要告訴程序,這個(gè)s中的01串的編碼是utf-8卓鹿,程序就應(yīng)該能正確工作菱魔。但這樣的解決方法有一個(gè)問題,就是不夠通用吟孙。假如我有個(gè)程序澜倦,它要讀取很多文本文件,每個(gè)文本文件的編碼都不一樣杰妓,豈不是針對(duì)每個(gè)讀進(jìn)來的文件都維護(hù)一個(gè)編碼信息藻治?很繁瑣。進(jìn)一步巷挥,如果這些文本文件的內(nèi)容還要做相互的比較連接之類的操作桩卵,編碼都不一致,豈不是更麻煩?

python是怎么聰明地解決這個(gè)問題的呢雏节?
很簡(jiǎn)單胜嗓,就是decode!

decode的意思是說钩乍,你有一個(gè)字符串辞州,并且你知道它的編碼,只要你用該編碼decode這個(gè)字符串寥粹,那么变过,python就會(huì)識(shí)別出里面的字符內(nèi)容,同時(shí)排作,建一個(gè)int數(shù)組牵啦,將每個(gè)字符的unicode序號(hào)存進(jìn)去。 所有的字符串都這樣做妄痪,就可以確保在程序運(yùn)行過程中,各種來源獲得的字符串都有一樣的表示楞件。它們就可以方便地進(jìn)行各種操作了衫生。int數(shù)組會(huì)被python封裝成一個(gè)對(duì)象,即unicode對(duì)象

問題4:搞定土浸!
下面罪针,我們?cè)趐ython命令行中輸入如下兩行代碼:

e = s.decode("utf-8")
isinstance(e,unicode)

程序的輸出是True,這說明黄伊,decode后返回的e確實(shí)是一個(gè)unicode對(duì)象泪酱。
unicode在這里是一個(gè)類,是python里面的類

e 被稱作unicode字符串还最,意思是說墓阀,它存的是字符的unicode序號(hào),并沒有使用任何編碼拓轻。
然后斯撮,我們就可以將e編碼成任意一種編碼,比如下面的操作都是可以的

e.encode("utf-8")
e.encode("gbk")

只要你選擇的編碼能夠?qū)中的字符進(jìn)行編碼即可扶叉,如果不能編碼勿锅,就會(huì)報(bào)錯(cuò)。
比如枣氧,如果你嘗試這樣:

e.encode("ascii")

由于ASCII并不能編碼 中國(guó) 這兩個(gè)字符溢十,所以會(huì)爆出 encode error。
至此达吞,我們已經(jīng)看到了兩種錯(cuò)誤张弛,decode error 和encode error,并解決了它們

問題5:如何評(píng)價(jià)python的這種字符編碼處理方法?
首先乌庶,這樣的處理方法非常的簡(jiǎn)單种蝶。任何文本,只要它進(jìn)入程序時(shí)進(jìn)行一次decode瞒大,就會(huì)變成unicode對(duì)象螃征,里面用int存著每個(gè)字符的unicode序號(hào)。只要在這個(gè)文本要輸出時(shí)再進(jìn)行一次encode透敌,編碼成我們需要的編碼就可以了盯滚。

問題是,所有的字符都用一個(gè)int來表示會(huì)不會(huì)太浪費(fèi)空間酗电?畢竟魄藕,用ASCII編碼,英文的字符只要一個(gè)字節(jié)就可以了撵术。

確實(shí)會(huì)費(fèi)點(diǎn)空間背率,但是現(xiàn)在的內(nèi)存都足夠大,而且我們只在程序內(nèi)部使用這種方式嫩与,當(dāng)字符串要寫入文件或者通過網(wǎng)絡(luò)傳輸時(shí)寝姿,我們都會(huì)進(jìn)行相應(yīng)的編碼的。

還有一個(gè)問題划滋,那些寫死在程序中的字符串怎么辦饵筑?難道每次使用都要進(jìn)行一次decode?不同的操作系統(tǒng)默認(rèn)使用的編碼是不一樣的,當(dāng)我們?cè)趌inux下处坪,通常需要用utf8做decode根资,在Windows下,通常需要用gbk做 decode同窘。這樣玄帕,我們的代碼就只能在特定的平臺(tái)運(yùn)行。

python給我們提供了一個(gè)很簡(jiǎn)單的辦法塞椎,只要在字符串前面加一個(gè)u桨仿,它就會(huì)幫我們探測(cè)系統(tǒng)的編碼,并自動(dòng)完成decode案狠。

在python2中

前兩句告知你的編輯器你用 UTF-8 (PEP-0263). 最后一句告知 Python 所有字符是 UTF-8 (unicode literals)

#!/usr/bin/python
#coding=utf-8
from __future__ import unicode_literals
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末服傍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骂铁,更是在濱河造成了極大的恐慌吹零,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉庵,死亡現(xiàn)場(chǎng)離奇詭異灿椅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門茫蛹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來操刀,“玉大人,你說我怎么就攤上這事婴洼」强樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵柬采,是天一觀的道長(zhǎng)欢唾。 經(jīng)常有香客問我,道長(zhǎng)粉捻,這世上最難降的妖魔是什么礁遣? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮肩刃,結(jié)果婚禮上祟霍,老公的妹妹穿的比我還像新娘。我一直安慰自己树酪,他們只是感情好浅碾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著续语,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厦画。 梳的紋絲不亂的頭發(fā)上疮茄,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音根暑,去河邊找鬼力试。 笑死,一個(gè)胖子當(dāng)著我的面吹牛排嫌,可吹牛的內(nèi)容都是我干的畸裳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼淳地,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怖糊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颇象,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤伍伤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后遣钳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扰魂,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劝评。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姐直。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒋畜,靈堂內(nèi)的尸體忽然破棺而出声畏,到底是詐尸還是另有隱情,我是刑警寧澤百侧,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布砰识,位于F島的核電站,受9級(jí)特大地震影響佣渴,放射性物質(zhì)發(fā)生泄漏辫狼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一辛润、第九天 我趴在偏房一處隱蔽的房頂上張望膨处。 院中可真熱鬧,春花似錦砂竖、人聲如沸真椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)突硝。三九已至,卻和暖如春置济,著一層夾襖步出監(jiān)牢的瞬間解恰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工浙于, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留护盈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓羞酗,卻偏偏與公主長(zhǎng)得像腐宋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檀轨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 幾個(gè)基本概念 bit二進(jìn)制位胸竞, 是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位,11010100是一個(gè)8位二進(jìn)制數(shù)裤园。一個(gè)二進(jìn)制位只...
    西電大俠閱讀 3,573評(píng)論 1 8
  • 編碼問題一直困擾著開發(fā)人員撤师,尤其在 Java 中更加明顯,因?yàn)?Java 是跨平臺(tái)語言拧揽,不同平臺(tái)之間編碼之間的切換...
    x360閱讀 2,482評(píng)論 1 20
  • 什么是編碼 任何一種語言剃盾、文字腺占、符號(hào)等等,計(jì)算都是將其以一種類似字典的形式存起來的痒谴,比如最早的計(jì)算機(jī)系統(tǒng)將英文文字...
    隨風(fēng)化作雨閱讀 1,548評(píng)論 1 2
  • 一衰伯、python程序編輯界面和運(yùn)行界面通常都是默認(rèn)unicode編碼字符串的,編輯界面則是ascii編碼的积蔚,也就是...
    木禾米粥閱讀 29,201評(píng)論 4 11
  • 寫python的過程中經(jīng)常出現(xiàn)各種蛋疼的編碼問題意鲸,于是通過上網(wǎng)查資料,自己做實(shí)驗(yàn)尽爆,想徹底搞清楚這個(gè)問題怎顾。 編碼和解...
    allen哦閱讀 523評(píng)論 0 1