撰寫於 2012-07-06 分類: python 標籤: python
encoding
概要:編碼轉換無疑是程式開發過程中常遇到而且很讓人頭疼的問題,一旦和資料庫互動那就更麻煩了,今天來總結一下 python 中編碼轉換的方法。
前一段時間就想寫一篇總結python字串的文章,但是時間較緊,而且我當時遇到的問題也不是很難,就暫擱下了,今天又被這編碼折磨一番,淚奔啊……
無論是什麼平台什麼編碼格式都能轉換為unicode格式。
以utf8編碼方式把字串轉換為unicode:
'aaa'
.decode
('utf8'
)pre
>
等同於<
preclass
="prettyprint"
>
unicode
('aaa'
,'utf8'
)
把unicode字串轉換為utf8編碼格式字串:
'aaa'
.decode
('utf8'
)
注意:這樣寫已經表示'aaa'是乙個unicode格式的字串了,等同於
u'aaa'
.decode
('utf8'
)
如果全部是英文本元或者數字,則utf8與gbk輸出結果一致,而且帶不帶u都一樣
這是中國程式設計師最苦逼的地方,什麼亂碼之類的幾乎都是由漢字引起的,傷不起!
把普通中午字串轉換為unicode:
'也有'
.decode
('gbk'
)
注意:此時字串前不能加u,而且漢字編碼只能寫gbk或者gb2312等
把上面的結果再轉成gbk
print
u'\u4e5f\u6709'.
encode
('gbk'
)
當然unicode可以轉成utf8,但是要看你的終端支援什麼編碼了,要不然就會亂碼,我用的win,所以就用gbk測試
如果不用print輸出,直接
u'
\u4e5f\u6709'.
encode
('gbk'
)
或者
u'
\u4e5f\u6709'.
encode
('utf8'
)
你會看到這兩個漢字在gbk和utf8編碼格式下的字元,這裡不多研究了(utf8漢字編碼比gbk多乙個字元)
下面把執行的結果輸出:
>>>
'aaa'
.decode
('utf8'
)u'aaa'
>>>
unicode
('aaa'
,'utf8'
)u'aaa'
>>>
'aaa'
.decode
('utf8'
)u'aaa'
>>>
u'aaa'
.decode
('utf8'
)u'aaa'
>>>
'也有'
.decode
('gbk')u'
\u4e5f\u6709
'>>>
print
u'\u4e5f\u6709'.
encode
('gbk')也有
>>>
u'\u4e5f\u6709'.
encode
('gbk')'
\xd2\xb2\xd3\xd0
'>>>
u'\u4e5f\u6709'.
encode
('utf8')'
\xe4\xb9\x9f\xe6\x9c\x89
'
說明:str()函式,有時候我們要借助它來過度轉換,比如u'%e9%95%bf%e6%98%a5%e5%b8%82',這就是我下午遇到的問題,把urlencode轉換的編碼經過urldecode解碼,結果前面多個u,此時是utf8編碼,然後decode成unicode,出問題了:
>>>s=
u'%e
9%95%
bf%e
6%98%
a5%e
5%b8%82'
>>>
import
urllib
>>>
urllib
.unquote(s
)u'\xe9\x95\xbf\xe6\x98\xa5\xe5\xb8\x82
'>>>
urllib
.unquote(s
).decode
('utf8'
)traceback
(most
recent
call
last
):file"",
line1,
infile
"d:\python26\lib\encodings\utf_8.py"
,line16,
indecode
return
codecs
.utf_8_decode
(input
,errors
,true
)unicodeencodeerror
:'ascii'
codec
can't encode characters in position 0-8: ordin
alnot
inrange
(128
)
特別注意:utf8編碼、gbk編碼的原型加上u然後再轉unicode是錯誤寫法,肯定轉不了,那怎樣去掉u呢?str()函式也不能直接轉,只好把u'%e9%95%bf%e6%98%a5%e5%b8%82'用str()處理去掉u,然後一切都ok了。
>>>
urllib
.unquote
(str(s
)).decode
('utf8')u'
\u957f\u6625\u5e02
'>>>
print
urllib
.unquote
(str(s
)).decode
('utf8'
)長春市
每次處理漢字,總要出現一些意外。最容易出現的問題有:
python中的字串有str和unicode兩種形式,兩者之間不能連線,也不能比較。漢字編碼,常見的有gbk和utf-8等形式,gb2312/cp936和gbk基本上是重合的。我曾經以為,utf-8編碼之後就是unicode型別的字串,結果導致概念不清,錯誤不斷。事實上,gbk和utf-8編碼之後,都是str型別的字串,字串前面加上u生成的才是unicode型別的字串。gbk字串、utf-8字串和unicode字串是可以相互轉換的,其關係如下圖所示:
至於如何確認乙個字串是哪一種型別的變數,則是乙個很簡單的問題:可以使用type()來檢查字串型別。例如:
python 漢字編碼
note1,json.dumps 因為json.dumps 序列化時對中文預設使用的ascii編碼.想輸出真正的中文需要指定ensure ascii false import json print json.dumps 中文 ensure ascii false note2,json.loads 載...
python 漢字編碼問題
問題描述 我要判斷的兩個字串是否相等 區站號 區站號 第乙個值是我從txt檔案匯入的資料,第二個值是我自己定義的並使用decode utf 8 得到的,如果你用print函式列印這兩個變數,則都是 區站號 但是if語句判斷,這兩個值是不相等的。用直接顯示的方式,u u533a u7ad9 u53f7...
漢字編碼問題
漢字編碼問題 由於常常要和漢字處理打交道,因此,我常常受到漢字編碼問題的困擾。在不斷的打擊與堅持中,也積累了一點漢字編碼方面的經驗,想和大家一起分享。一 漢字編碼的種類 漢字編碼中現在主要用到的有三類,包括gbk,gb2312和big5。1 gb2312又稱國標碼,由國家標準總局發布,1981年5月...