首先聲明幾個名詞解釋:
1. 文件自己的編碼:能夠利用file
檢查文件的編碼格式。例如:python
file test.py test.py: UTF-8 Unicode Java program text
這時文件自己的編碼是UTF-8的。vim
encoding
。例如:# -*- encoding: utf-8 -*- import sys
既然存在2個編碼,那麼就存在相同和不一樣狀況,二者相同天然是沒問題,好比都是gb18030或者utf-8,若是不一樣會怎麼樣呢?顯然是編碼顯示錯誤,看以下幾個例子:
文件編碼爲utf-8,代碼編碼爲gb18030,有:this
# -*- encoding: gb18030 -*- str_alphabeta = "ABCDEFG" print type(str_alphabeta) print str_alphabeta str_kanji = "可口可樂" print type(str_kanji) print str_kanji
輸出爲:google
File "test.py", line 1 SyntaxError: encoding problem: with BOM
出現一個新的關鍵詞BOM,這個能夠google一下,若是你在vim中看到<feff>
這麼一個東西,那也是BOM引發的,若是文檔是utf-8我的以爲使用無BOM格式會好處理點。
那麼爲了能正常運行,須要文檔的編碼和代碼的編碼一致。編碼
來自future庫的內容表示如今還在「試用」階段,若是你追求「新」就用,若是你追求「穩」就別用(我這麼理解的,雖然我常常用division)。
unicode_literals的幫助是這麼寫的:code
>>> help(unicode_literals) Help on instance of _Feature in module __future__: class _Feature | Methods defined here: | | __init__(self, optionalRelease, mandatoryRelease, compiler_flag) | | __repr__(self) | | getMandatoryRelease(self) | Return release in which this feature will become mandatory. | | This is a 5-tuple, of the same form as sys.version_info, or, if | the feature was dropped, is None. | | getOptionalRelease(self) | Return first release in which this feature was recognized. | | This is a 5-tuple, of the same form as sys.version_info.
簡單地說就是,非unicode(32)的代碼編碼(例如utf-8),直接賦值一個字符串獲得的編碼是代碼的編碼方式,對象的類型是str
,可是若是字符串前面加一個「u」就表示這個字符串是unicode(32)的編碼,例如:orm
# -*- encoding: utf-8 -*- str_kanji = "可口可樂" print type(str_kanji) print str_kanji str_kanji_unicode = u"可口可樂" print type(str_kanji_unicode) print str_kanji_unicode
輸出爲:對象
<type 'str'> 可口可樂 <type 'unicode'> 可口可樂
第一個可口可樂是utf-8編碼的(能夠經過locale中的LC_CTYPE來驗證),第二個是unicode(32)的。
若是import unicode_literals則變爲(代碼略):utf-8
<type 'unicode'> 可口可樂 <type 'unicode'> 可口可樂