工作中遇到如下問題
>>> str(u'我') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128)
解決方式如下
>>> str(u'我'.encode('utf-8')) '\xe6\x88\x91'
即把unicode轉為utf-8編碼。但是不是unicode字符都這樣處理呢?看下面的
>>> str(u'abc') 'abc'
以上不處理一樣可以的!
為什么會這樣?http://docs.python.org/2/howto/unicode.html里有一段已經說的很明顯了。
即:
內置函數 unicode() 提供了訪問(編碼和解碼)所有已注冊的 Unicode 編碼的方法。它能轉換眾所周知的 Latin-1, ASCII, UTF-8, 和 UTF-16。后面的兩個可變長編碼字符集用一個或多個 byte 存儲 Unicode 字符。默認的字符集是 ASCII,它只處理0到127的編碼,拒絕其它的字符並返回一個錯誤。當一個 Unicode 字符串被打印、寫入文件或通過 str() 轉化時,它們被替換為默認的編碼。
再看下面的例子
In [5]: a = u'你好' In [6]: a Out[6]: u'\u4f60\u597d' In [7]: b = '你好' In [8]: b Out[8]: '\xe4\xbd\xa0\xe5\xa5\xbd' In [9]: print a 你好 In [10]: print b 你好
從上面我看出幾點疑問:
1 中文的常量,不論字符串,還是unicode它顯示的這些到底是什么?其實這些就是常量在系統默認編碼。那上面我的系統默認編碼到底是GBK顯示還是UTF-8顯示呢?
因為我的是centos的所以只需要vi /etc/sysconfig/i18n 就知道了, 我的是utf-8的,
2 無論print a還是print b都正確顯示了我所認識的漢字“你好”這又是怎么回事?這最好還是看一下源碼,不過我能力有限,只能自行google了,基本上大致意思就是print打印會自動給對象編碼,比如一個unicode對象,用print打印,它都會自行轉化成當前編碼,但是如果是write方式就不行,必須你自己手動去處理編碼。這也就是上面提到的報錯原因。
說了上面的,還有一個問題困撓我,decode()跟encode()方法。
即“decode是string2unicode,encode自然就是unicode2string。”
雖然就一句話的事,但我就是記不住。不知道各位是怎么理解的,然后能熟練運用的。反正我每次用的時候都是當場試驗。都哪天我終於理解或者明白了,我再來把這個坑給補了吧~~
BTW:如果是windows系統,我下面的是xp的查找系統默認編碼方式
然后打開控制面板-->語言與區域選項--->高級選項里查找代碼頁轉換表
,936對應的是GBK編碼。
即我的操作系統的默認編碼是GBK
參考:
http://blog.csdn.net/feisan/article/details/1666876
http://blog.csdn.net/feisan/article/details/1667417
http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue5/unipain.html
http://blog.csdn.net/trochiluses/article/details/16825269