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