以下皆为Python2.x中--------------------
1、str与unicode
s = '哈哈' #str对象
u = u'哈哈' #unicode对象
Python系统内部表示字符串使用unicode对象,采用默认编码。
str对象,即展现出的字符串,经过了utf-8或gbk方式等编码。
Windows下命令行控制台使用gbk编码,所以在控制台中s以gbk格式编码,ss为unicode
IDLE中默认同样为gbk编码,所以s为gbk编码;很奇怪的是,ss同样为gbk编码……
2、encode与decode
u.encode('utf-8')将unicode对象u编码为str,参数为编码方式
s.decode('utf-8')将str对象s解码为unicode,参数为解码方式
s = '哈哈' # '\xb9\xfe\xb9\xfe'
u = u'哈哈' # u'\u54c8\u54c8' #在IDLE下为'\xb9\xfe\xb9\xfe'
ss = s.decode('gbk') # u'\u54c8\u54c8' #在IDLE下为u'\u54c8\u54c8'
uu = u.encode('gbk') # '\xb9\xfe\xb9\xfe'
故而将gbk转为utf-8,可用str.decode('gbk').encode('utf-8')
3、Python使用中文
# coding=utf-8
此条指令用于指明该文件以utf-8格式编码,以utf-8格式解析可能存在的中文。同时,文件中的str对象都是utf-8格式编码。
FTP服务器不一定采用哪种编码方式,通过ftplib访问“高清”的电影时
path = "影视/电影/高清"
ftp.cwd(path) #若服务器同样为utf-8,传递path参数没问题
ftp.cwd(path.decode('utf-8').encode('gbk')) #若服务器为gbk,则需将path转为gbk格式
当然,也可以用以下方式,本质是相同的,只不过path直接存储的unicode而已。这样,当源文件编码改变时不需改变代码。
path = u"影视/电影/高清"
ftp.cwd(path.encode('gbk'))
--------------------------------------------------
在IDLE或windows命令行中,可以不指定源文件coding并且直接使用
path = "影视/电影/高清"
ftp.cwd(path)
如上所述,IDLE和windows命令行默认为gbk,path参数同样为gbk,而服务器恰好也为gbk……
很多时候,采用默认编码可以执行,但自己指定源文件编码后却不可执行,都是因为与待读取文件、远程服务端格式不匹配造成的。
---------------------------------------------------
Python3.x中str对象同样为unicode,原生支持中文了……