Python漢字編碼經驗總結

2021-06-20 06:05:39 字數 3738 閱讀 4331



撰寫於 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月...