一、问题:在python3.x中运行的脚本,包含了文件名(含中文)的截取,文件名(含中文)的计数等,应用到python2.7中,即使指定utf-8编码,也不能实现相应的功能。
二、分析:
1.python2和python3编码区别
python3 源文件以UTF-8编码,所有字符串以unicode编码。
python2 源文件默认以ASCII编码,所以在读取中文时会报错,需在开头指定UTF-8编码:
# -*- coding: utf-8 -*-
2.UTF-8编码特点:
UTF-8编码将一个unicode字符编码成1~6个字节,常用英文字母编码成1个字节,汉字一般编码成3个字节(也有编码成4~6个字节)。
三、解决方案
例:str_a = '蓝67XV黑白',截取最后两位字符。
python3
str_b = str_a[-2:]
python2(已指定utf-8编码)
str_b = str_a.decode('utf-8')[-2:].encode('utf-8')
python3 所有字符串以unicode编码,无论中文字符、字母和数字都占相同的字节数,直接根据字符在字符串中的位置截取即可。
python2中,指定utf-8编码时(以避免中文字符识别错误),带有中文的字符串占字节数不同,一般以三位表示一个中文字符,比如 python 3中len(str_a)=7,python 2中len(str_b)=13。先对字符串解码,str_a.decode('utf-8') 表示当前编码是utf-8,将其解码为unicode(python中,unicode为编码的基本类型),len(str_a.decode('utf-8') )=7。截取完相应的字符串,再unicode编码encode成utf-8编码。