python中的編碼問題

1. 聲明

首先聲明幾個名詞解釋:
1. 文件自己的編碼:能夠利用file檢查文件的編碼格式。例如:python

file test.py
test.py: UTF-8 Unicode Java program text

這時文件自己的編碼是UTF-8的。vim

  1. python代碼的編碼:打開文件,在文件上部添加的encoding。例如:
# -*- encoding: utf-8 -*-
import sys

2. 怎麼設定編碼

既然存在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格式會好處理點。
那麼爲了能正常運行,須要文檔的編碼和代碼的編碼一致編碼

3. unicode_literals

來自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'>
可口可樂
相關文章
相關標籤/搜索