總結string-escape和unicode-escape

首先要明確,string與unicode在python中的含義。


》》 string-escape是對二進制的字節流,一個字節一個字節轉義,並對每個字節以16進制輸出,比如:
In [22]: print "中".encode("string-escape")
\xe4\xb8\xad  #注意,這是一個字符串'\\xe4\\xb8\\xad'
這裏是將"中"的utf-8編碼值(E4B8AD)輸出成一個可見字符串。
In [72]: "中".encode("string-escape")
Out[72]: '\\xe4\\xb8\\xad'
In [64]: u"中".encode("gbk").encode("string-escape")
Out[64]: '\\xd6\\xd0'
這裏是將“中”以gbk編碼之後的編碼值輸出。

》》 unicode-escape是對unicode編碼的字節流,兩個字節兩個字節轉義,並對每兩個字節一起以16進制輸出。
In [27]: print u"中".encode("unicode-escape")
\u4e2d
這裏是將“中”的unicode編碼值(4E2D)輸出。

總結下:

unicode <-> utf8/gbk <-> string-escape
unicode <-> unicode-escape



對轉義反斜線,兩者的效果一樣!
In [36]: print '\\\\u4e2d'.decode('unicode-escape')
\u4e2d
In [37]: print '\\\\u4e2d'.decode('string-escape')
\u4e2d
In [44]: print '\\\\xe4\\\\xb8\\\\xad'.decode('unicode-escape')
\xe4\xb8\xad
In [45]: print '\\\\xe4\\\\xb8\\\\xad'.decode('string-escape')
\xe4\xb8\xad


深刻理解這兩個字符串的含義和區別:

In [76]: "\\x41\\x42\\x43\\xe4\\xb8\\xad"
Out[76]: '\\x41\\x42\\x43\\xe4\\xb8\\xad'
In [57]: len("\\x41\\x42\\x43\\xe4\\xb8\\xad")
Out[57]: 24

In [77]: "\x41\x42\x43\xe4\xb8\xad"
Out[77]: 'ABC\xe4\xb8\xad'
In [78]: len("\x41\x42\x43\xe4\xb8\xad")
Out[78]: 6

關於讀文件:
如果文件中存儲的內容是"\x41\x42\x43\xe4\xb8\xad"
那麼python程序去讀到的是字符串其實是:"\\x41\\x42\\x43\\xe4\\xb8\\xad"
In [57]: len("\\x41\\x42\\x43\\xe4\\xb8\\xad")
Out[57]: 24
也就是說,讀到的內容,需要先decode("string-escape"),然後再decode("utf-8")



其他例子:
In [51]: "\x41\x42\x43\xe4\xb8\xad".decode('string-escape').decode('utf-8')
Out[51]: u'ABC\u4e2d'
In [55]: print "\\x41\\x42\\x43\\xe4\\xb8\\xad".decode('string-escape').decode('utf-8')
ABC中
In [79]: print "\x41\x42\x43\xe4\xb8\xad".decode("utf-8")
ABC中


附:編碼相關知識

UNICODE 的範圍是 0x0000 - 0xFFFF 共6萬多個字符,其中光漢字就佔用了4萬多個
Unicode 編碼系統,可分爲編碼方式實現方式兩個層次。
UTF-8UTF-16UTF-32都是將數字(unicode的數值)轉換到程序數據的編碼方案。

UTF-8 vs GBK:
UTF-8版本雖然具有良好的國際兼容性,但中文需要比GBK/BIG5版本多佔用50%的數據庫存儲空間,因此並非推薦使用,僅供對國際兼容性有特殊要求的用戶使用。簡單地說:對於中文較多的網站,適宜用GBK編碼節省數據庫空間。對於英文較多的網站,適宜用UTF-8節省數據庫空間。

大部分是中文的同一份數據的空間佔用示例:
-rw-rw-r-- 1  6372 May 27 14:01 gbk
-rw-rw-r-- 1  9204 May 27 14:01 utf-8

參考資料:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章