[爆卦]python中文編碼是什麼?優點缺點精華區懶人包

為什麼這篇python中文編碼鄉民發文收入到精華區:因為在python中文編碼這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者StubbornLin (Victor)看板Python標題Re: [問題] 中文編碼的疑惑.....


※ 引述《milua (milua)》之銘言:
: 剛學習python
: print 中文的問題一直困擾著我
: 但又解決不了
: 我的ide 是 eclispe + pydev
: 我寫了一個test code為
: =========python code=======
: #-*- coding: utf-8 -*-
: print '科科'
: ===========================
: 存檔編碼,我是選utf8
: 用windows cmd 執行 出來的結果為
: 蝘?
因為在這裡你是用utf8去編python的檔案,'科科'被當做utf8編碼

#-*- coding: utf-8 -*-
print '科科'
print repr('科科')

蝘?
'\xe7\xa7\x91\xe7\xa7\x91'

這麼看來就明白了,因為ascii的普通str,應該會被直接輸出
沒有經過編碼,所以就直接等於用ascii來輸出utf8的內容
會有亂碼是理所當然的 這就等於直接印出binary的那串資料而已
你的windows console不會認得utf8的編碼,它是用cp950的方式去解碼
用cp950去解utf8 結果就會是亂碼

'\xe7\xa7' 可能剛好被解碼成cp950的 蝘 所以才看得到 其它就是一團糟

: 如果換成 print u'科科'

#-*- coding: utf-8 -*-
print u'科科'
print repr(u'科科')

如果是unicode的字串,就不一樣了,由於Python認得了它是unicode的字串
知道該用怎樣正確的方式把它解碼成unicode的字串

科科
u'\u79d1\u79d1'

並且,在print時,會依照sys.stdout.encoding去編碼字串
在你的環境,也就是cp950

u'\u79d1\u79d1' 就會被重編成 cp950編碼的 '科科'

這時候windows的console就認得了,因為它一直都是用cp950在解碼
cp950的碼c950來解 當然就沒問題

基本上Python都支援unicode了,就用unicode也就是u開頭的字串就好
如果非要讓非u開頭的字串也能正確印出來的話,那就將計就計
反正它被變成utf8,那就用utf8去解碼,轉成unicode
再印出來,像這樣

#-*- coding: utf-8 -*-
print '科科'.decode('utf8')
print repr('科科'.decode('utf8'))

可是這樣到頭來繞一圈都是一樣的,那何苦多繞一圈
就直接用unicode就可以了

--
哇咧咧 創意投票系統 http://walele.com
易記學 程式設計教學 http://ez2learn.com/
易記學 程式設計討論區 http://forum.ez2learn.com
VICTOR's 個人Blog http://blog.ez2learn.com/
財報分析王 http://victorlin.serveftp.org/stock/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.81.119

你可能也想看看

搜尋相關網站