unicode字符、python乱码问题
http://www.cnblogs.com/BeginMan/archive/2013/08/08/3246619.html#a1 ?Python常見常用知識點
http://blog.csdn.net/tingsking18/article/details/4033645? Unicode和Python的中文處理
如何讓Python的Unicode字符串支持中文?
要想利用Python的Unicode機制處理字符串,只要能夠擁有一個能夠把多字節(jié)的中文編碼(包括GB編碼系列和BIG5系列)和Unicode編碼進行雙向轉換的編碼/解(在C:\Python27\Lib\encodings\aliases.py中可以找到)模塊就可以了。按照Python的術語,這樣的編碼/解碼模塊被稱為codec。
Python的Unicode處理模塊有三個最重要的組成部分:一是codecs.py文件,二是encodings目錄,三是aliases.py文件。Python解釋器在需要分析Unicode字符串時,會自動加載encodings目錄下的這個aliases.py文件。
這個文件中只定義了一個哈希表aliases,它的每個鍵對應著每一個codec在使用時的名稱,也就是unicode()內建函數(shù)的第二個參數(shù)值;而每個鍵對應的值則是一個字符串,它是這個codec對應的那個處理文件的模塊名。比如,Python默認的解析UTF-8的codec是utf_8.py,它存放在encodings子目錄下,則aliases哈希表中就有一項表示其對應關系:
?#?gb2312?codec'chinese'????????????:?'gb2312','csiso58gb231280'????:?'gb2312','euc_cn'?????????????:?'gb2312','euccn'??????????????:?'gb2312','eucgb2312_cn'???????:?'gb2312','gb2312_1980'????????:?'gb2312','gb2312_80'??????????:?'gb2312','iso_ir_58'??????????:?'gb2312',#?gbk?codec'936'????????????????:?'gbk','cp936'??????????????:?'gbk','ms936'??????????????:?'gbk',codecs.py文件定義了一個標準的Codec模塊應有的接口,部分內容:
Codec.encode(input, errors = "strict")
用于將輸入的數(shù)據(jù)看做是Unicode字符串,并將其“編碼”,轉換成對應的傳統(tǒng)
Python字符串。
Codec.decode(input, errors = "strict")
用于將輸入的數(shù)據(jù)看做是傳統(tǒng)Python字符串,并將其“解碼”,轉換成對應的Unicode
字符串。
分——————割—————————線———————————————————
python編碼問題encode,decode
1. 字符串'xxx'雖然是ASCII編碼,但也可以看成是UTF-8編碼,
而u'xxx'則只能是Unicode編碼
?
2. 把u'xxx'轉換為UTF-8編碼的'xxx'用encode('utf-8')方法:
>>>?u'ABC'.encode('utf-8') 'ABC' >>>?u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87'?
3. 反過來,把UTF-8編碼表示的字符串'xxx'轉換為Unicode字符串
u'xxx'用decode('utf-8')方法 >>>?'abc'.decode('utf-8') u'abc' >>>?'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') u'\u4e2d\u6587' >>>?print?'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') 中文?
4. IDLE 中文亂碼
http://hi.baidu.com/yobin/item/166e3a46537781d3c1a59257
#?utf-8?中一個漢字?占用三個長度 #?gbk?中一個漢字?占用兩個長度 #?1.?utf-8 >>>data?=?u'長城'.encode('utf-8') >>>?data '\xe9\x95\xbf\xe5\x9f\x8e' >>>?print?data 闀垮煄 >>>?print?data.decode('utf-8')?? 長城?
# 2. gbk
>>>?data?=?u'長城'.encode('gbk') >>>?data '\xb3\xa4\xb3\xc7' >>>?print?data 長城 >>>?print?data.decode('gbk') 長城
分——————割—————————線———————————————————
幾個知識點
1.string.decode(encoding='UTF-8', errors='strict'):以 encoding 指定的編碼格式解碼 string,如果出錯默認報一個ValueError 的 異常 , 除非 errors 指的是 'ignore' 或者 'replace'
string.encode(encoding='UTF-8', errors='strict') :以 encoding 指定的編碼格式編碼 string,如果出錯默認報一個ValueError 的異常, 除非 errors 指定的是'ignore'或者'replace'
2.unicode 字符
>>>?print?'hello'.encode('UTF-8') hello >>>?print?'hello'.decode('UTF-8') hello>>>? >>>?print?'hello'.encode('base64') aGVsbG8=>>>?print?'hello'.encode('ascii') hello >>>?print?'hello'.decode('ascii') hello>>>?print?'長城'.encode('gb2312') UnicodeDecodeError:?'ascii'?codec?can't?decode?byte?0xb3 >>>?print?u'長城'.encode('gb2312') 長城 >>>?print?'長城'.decode('gb2312') 長城 >>>?print?'長城'.decode('ascii') UnicodeDecodeError:?'ascii'?codec?can't?decode?byte?0xb3>>>?print?unicode('長城') UnicodeDecodeError:?'ascii'?codec?can't?decode?byte?0xb3 >>>?print?unicode('長城','gb2312') 長城>>>?print?unicode('你好','gb2312') 你好 >>>?print?'你好' 你好 >>>?s='你好' >>>?print?s????#str():給人看的 你好 >>>?s????#repr():給計算機看的 '\xc4\xe3\xba\xc3'3.python亂碼問題
一直以來,python中的中文編碼就是一個極為頭大的問題,經常拋出編碼轉換的異常,python中的str和unicode到底是一個什么東西呢??
在python中提到unicode,一般指的是unicode對象,例如'哈哈'的unicode對象為?u'\u54c8\u54c8'?
而str,是一個字節(jié)數(shù)組,這個字節(jié)數(shù)組表示的是對unicode對象編碼(可以是utf-8、gbk、cp936、GB2312)后的存儲的格式。這里它僅僅是一個字節(jié)流,沒有其它的含義,如果你想使這個字節(jié)流顯示的內容有意義,就必須用正確的編碼格式,解碼顯示。
對于unicode對象哈哈進行編碼,編碼成一個utf-8編碼的 str-s_utf8,s_utf8就是是一個字節(jié)數(shù)組,存放的就是'\xe5\x93\x88\xe5\x93\x88',但是這僅僅是一個字節(jié)數(shù)組, 如果你想將它通過print語句輸出成哈哈,那你就失望了,為什么呢?
因為print語句它的實現(xiàn)是將要輸出的內容傳送到操作系統(tǒng),操作系統(tǒng)會根據(jù)系統(tǒng)的編碼對輸入的字節(jié)流進行編碼,這就解釋了為什么utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,因為 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解釋,其顯示的出來就是“鍝堝搱”。這里再強調一下,str記錄的是字節(jié)數(shù)組,只是某種編碼的存儲格式,至于輸出到文件或是打印出來是什么格式,完全取決于其解碼的編碼將它解碼成什么樣子。
轉載于:https://blog.51cto.com/dragonball/1419969
總結
以上是生活随笔為你收集整理的unicode字符、python乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Magento安装后无法访问
- 下一篇: Linux基础(九)--定时任务