encode&decode

decode()和encode()

encode()和decode()都是字符串的函數,分別指編碼和解碼,在python中,Unicode類型是做爲編碼的基礎類型,以下:python

decode                 encode
str ---------> str(Unicode) ---------> str

即:
str.decode()是指其餘編碼方式解碼爲unicode碼,
str.encode(‘qita’)unicode碼編爲qita格式的函數

#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文字符'  # 這裏的 str 是 str 類型的,而不是 unicode
print  s.encode('gb2312')

這個代碼會報錯:ui

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

這句代碼直接將s 從新編碼爲 gb2312 的格式,即進行 unicode -> str 的轉換。由於 s 自己就是 str 類型的,所以
Python 會自動的先將 s 解碼爲 unicode ,而後再編碼成 gb2312。編碼

由於解碼是python自動進行的,咱們沒有指明解碼方式,python 就會使用 sys.defaultencoding指明的方式來解碼。不少狀況下 sys.defaultencoding爲ANSCII,若是 s 不是這個類型就會出錯。.net

因此要設置缺省解碼方式code

解決方法:blog

1. 明確的指示出 s 的編碼方式

#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文字符'  # 這裏的 str 是 str 類型的,而不是 unicode
print  s.decode('utf-8').encode('gb2312')

2. 更改 sys.defaultencoding 爲文件的編碼方式

開頭添加以下代碼:內存

import sys
reload(sys) 
sys.setdefaultencoding('utf-8')
#! /usr/bin/env python
#  -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化後刪除了 sys.setdefaultencoding 方法,咱們須要從新載入
sys.setdefaultencoding('utf-8')

str = '中文字符'
print str.encode('gb2312')

acsii,utf-8,unicode關係

linkutf-8

  1. ascii 英文
  2. utf-8 全部語言
  3. nuicode 支持全部編碼(可是若是你寫的文本基本上所有是英文的話,不必nuicode,ascii更節省內存)。因此,本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8編碼

因此用utf-8基本就夠了ci

相關文章
相關標籤/搜索