中文編碼問題是用中文的程式設計師經常頭大的問題,在python下也是如此。
我們要知道python內部使用的是unicode編碼,而外部卻要面對千奇百怪的各種編碼,比如作為中國程式經常要面對的gbk,gb2312,utf8等,那這些編碼是怎麼轉換成內部的unicode呢?
一:源**檔案的編碼格式
python缺省會認為源**檔案是asci編碼。
s1='hello'
print s1
s1='你好'
print s1
這個**檔案被執行時就會出錯。python預設將**檔案內容當作asci編碼處理,但asci編碼中不存在中文,因此丟擲異常。
解決方法就是讓python知道檔案中使用的是什麼編碼。只需在**檔案的最前端新增如下:
# -*- coding: utf-8 -*-
表示我這個檔案裡的文字是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字元,然後轉換成unicode編碼內部處理使用。
二:window下控制台編碼
python 的 print 語句。它的功能是向控制台輸出字元,這本身不是問題。但是 python 內部是支援 unicode 字串的,而 unicode 字串在用 print 輸出時 print 要進行一次從 unicode 到 ansi/mbcs 編碼的編碼,編碼後才會以 8-bit 流輸出結果。
編碼就編碼吧,這也是很正常的。對於控制台程式來說,輸出可能被重定向到文字檔案。如果不指定編碼,重定向時就不知道以何種 8-bit 位元組流寫入文字檔案,所以,輸出到控制台的東西理論上也應該是經過編碼的 8-bit 流。綜上所述,確實有必要進行一次 wchar 到 char 的轉碼。
但是問題在於,python 的 print 語句在轉碼時,居然用的是 strict 規則。即,待輸出字串若含有當前**頁之外的字元,就會在轉碼過程中出現不可轉碼的文字,從而丟擲 exception。print 語句又不處理這個 exception,導致乙個平平常常 print 語句竟然會引起 python 程式的異常!
解決方法一:
chcp
chcp是ms dos中的命令,用來顯示或設定活動**頁編號的。用法是:
chcp [nnn]
其中nnn指定的是**頁的編號。這個引數是可選的,在命令列下如果不指定這個**頁編號,那麼預設是顯示當前的**頁編號。比如,在預設的cmd視窗中,我們輸入chcp,顯示的將類似:
活動的**頁: 936
這裡的936表示當前使用的是簡體中文(gb2312)編碼。如果輸出的字元在**頁之內,就不會出現問題。如果出現了,可以:
執行cmd;
輸入 chcp,回車檢視當前的編碼;
輸入chcp 65001,回車;(指定為utf-8)
這時候,你的console裡面,應該支援utf8了。
三:檔案讀取
其中,關於open的編碼解釋如下:
讀取時:內建的open()方法開啟檔案時,read()讀取的是str,讀取後需要使用正確的編碼格式進行decode()。write()寫入時,如果引數是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉成unicode後再使用寫入的編碼進行encode()。如果直接將unicode作為引數傳入write()方法,python將先使用源**檔案宣告的字元編碼進行編碼然後寫入。
編碼時:模組codecs提供了乙個open()方法,可以指定乙個編碼開啟檔案,使用這個方法開啟的檔案讀取返回的將是unicode。寫入時,如果引數是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據源**檔案宣告的字元編碼,解碼成unicode後再進行前述操作。相對內建的open()來說,這個方法比較不容易在編碼上出現問題。
所以可以在讀取的時候指定編碼,這樣可以避免很多問題
window 下Python環境搭建
一 安裝python python安裝是否成功,cmd開啟命令列輸入 python 命令,顯示版本資訊即安裝成功。python的安裝目錄新增到pth系統變數中即可 二。開發工具 三。打包編譯工具 快速安裝方法 開啟 cmd 輸入 pip install pyinstaller 命令自動安裝完成。輸入...
Window下python轉exe工具
pip install pyinstaller pip install pypiwin32 upx壓縮工具 可不必,只是減少exe體積 放入python安裝目錄 pyinstaller f w i i.ico test.pyw f 生成乙個檔案 d 生成乙個目錄 預設 k 包含tcl tk d de...
window下python網路程式設計問題
最近在學習 在編寫非同步python套接字伺服器應用程式時遇到問題,顯示如下 發現 os.fork 呼叫與 module object has no attribute fork 即os塊沒有fork函式,os是python內建的塊怎麼會沒有fork函式?然後發現問題是window環境下沒有fork...