這兩天在糾結一份代碼, 徹底解決後把之前遇到的相關問題整理一份出來,一來自己理清思路,一來在網上有什麼錯誤也會被提前發現。
1. 原始碼層級
REF: PEP 0263 -- Defining Python Source Code Encodings
Python will default to ASCII as standard encoding if no other
encoding hints are given.
To define a source code encoding, a magic comment must
be placed into the source files either as first or second
line in the file
原始碼層級是指在.py檔案中,採用了何種類型的編碼作為原始碼。
預設與作業系統一樣,都是採用了最簡單的ASCII編碼。當使用了中文注釋後,就會提示如下問題
SyntaxError: Non-ASCII character '\xe5' in file test.py on line 5, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
這時,就需要設定檔案的編碼語言,最好看的寫法是:
# -*- coding : utf-8 -*-
我覺得看到這行代碼的時候,會有些看向美女的感覺。
咱們碼農還是這樣吧。。 #coding: utf-8
這樣,在原始碼層級使用中文就沒有問題了。我們可以輕鬆通過解譯器這一關
2. 代碼儲存層級
在linux下呆久了,會有個缺點,很少關注無關的東西,寫個代碼utf-8就完事了。
用ultra的時候突然發現原來UTF-8 還有炸彈的,很可能天上掉下個大炸彈,代碼就失效了:)
引用一段很不錯的介紹:http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html 關於bom對檔案影響
總體來說就是windows下,bom會在最開端插入標明自身的簽名。
因此如果想在linux下使用這份指令碼,儲存為通用的utf-8 無炸彈吧!
3. 代碼執行層級
info = "啟動中..." 或 info = u"啟動中..."
這裡只要牢記--在編譯時間會把 字串 轉換成 unicode對象 就可以了
即已經不再是按照原始碼的格式來儲存字串了。
而不包含u的,則是按照原始格式儲存。而這裡的原始格式,恰好就是之前第一部分說到的原始碼層級編碼格式。
再後續執行時,就涉及到了運行環境的編碼,
可以使用 sys.getdefaultencoding() 查看當前運行環境的編碼
使用reload(sys)
sys.setdefaultencoding('utf-8') 重新設定運行環境編碼
而處理編碼文本就是一個套路了,先根據源格式decode,再encode成自己想要的格式