python的編碼問題

來源:互聯網
上載者:User

  前兩天理解了unicode、utf-8、gb2312這些編碼之間的關係以後,今天終於弄明白了在python裡面的編碼問題。我們在寫python指令碼時如果有中文的字串,在啟動並執行時候有可能會報錯也有可能會出現亂碼。一般加上# -*- coding:utf-8 -*-就不會報錯了,但是還可能有亂碼問題,而且同樣的代碼在不同的編輯器中得出的結果還有可能不一樣,你是否也遇到過這些問題而且理不清頭緒?希望我的講解能讓你對這個問題有一定的理解。

  對於python的一個指令碼來說有三種編碼:

1. 指令檔的編碼

    指令碼儲存時的編碼格式,不同的編輯器採用的格式不同會造成一定的混亂,一般是utf-8或者cp936(windows上)

 

2. python解析器的編碼

    python預設使用ascci編碼,所以如果你的指令碼中出現了中文,用ascci編碼區解析一定會出錯,因為ascci不沒有utf-8,cp936裡面的中文字元的。所以你要在指令碼的第一行加入# -*- coding:utf-8 -*-注釋來通知python解析器使用utf-8,但是這個只是通知一下python而不是真的用utf-8的編碼區解析這裡的中文字串。例如,你寫了一個指令碼儲存的編碼是cp936的,如果不加入注釋一定會在運行時報錯,因為ascci不包括cp936裡面的字元,而你寫了第一行的注釋就不會報錯了因為utf-8中有這個字元,但是字元的含義未必是那個中文,它僅僅是處理一下。這裡有個地方需要注意如果你的指令碼儲存時的編碼是utf-8的就不需要第一行的注釋,python會正確識別。我個人理解是python只識別utf-8和ansi兩種格式的檔案,ansi格式的需要明確指出coding,否則python預設使用ascci來處理

 

3. 運行指令碼的環境的編碼

    如果運行環境的編碼格式與指令檔的格式相同就正確顯示,不同就是亂碼,因為運行環境會進行解碼

 

還是看看代碼吧:

# -*- coding:utf-8 -*-  #如果沒有這句會報錯,預設的ascci無法解析cp936編碼

# cp936編碼儲存

 

str = 'abc中文'

print str#cmd中正確顯示,因為cmd是cp936編碼

ustr = u'abc中文'#報錯,因為無法用utf-8的格式去對cp936進行解碼,

ustr1 = unicode(str, 'cp936')#正確, 因為解碼用的編碼與檔案儲存體的編碼相同

 

=============================================

# utf-8編碼儲存

 

str = 'abc中文'

print str#cmd       #不會報錯但是顯示為亂碼,如果放到cygwin中執行顯示正確,因為cygwin的bash是utf-8的

 

ustr = u'abc中文'#正確,因為python對utf-8編碼的檔案預設使用utf-8編碼集

print ustr#正常顯示,因為unicode是"通用“的編碼集,可以被轉化成其他的編碼方式

 

==============================================

# unicode編碼儲存,實際為utf-16le

str = 'abc'#報錯,因為utf-16的編碼會在開頭加入 FFFE兩個位元組,這個時候python會預設使用ascci來處理,因為就算你加了# -*- coding:utf-16 -*- 也沒用,因為python還沒解析到這句就已經解析失敗了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.