py2的字符串有两种形式 str和unicode
str形式是‘’ unicode形式是u‘’
str ————》decode————》unicode
str 《———— encode 《———— unicode
py2 windows 终端
>>> a = '罗'
>>> a.decode('gbk' )
u'\u7f57'
可以用gbk解码,并且解码出来的u'\u7f57',参照站长工具是gbk,所以在终端输入中文是采用gbk编码的,为什么呢?
>>> import locale
>>> locale.getdefaultlocale()
('zh_CN' , 'cp936' )
因为终端默认编码是gbk。
py2 windows pycharm
a = '罗'
运行结果
SyntaxError: Non-ASCII character '\xe7' in file C:... on line 1 , but no encoding declared; see http://python.org/dev/peps/pep-0263 / for details
ascii报错,为什么是ascii呢
>>> sys.getdefaultencoding()
'ascii'
因为系统的默认编码是ascii
解决:
a = '罗'
b =a .decode('utf-8' )
print b
通过# -*- coding:utf-8 -*- 告诉解释器,编译和存储这个文件的所有str用utf-8,没有这句就算是注释里有中文,也会报错。
但是
import sys
reload(sys)
print sys.getdefaultencoding()
a = '罗'
b =a.decode('utf-8' )
print b
结果
ascii
罗
默认编码还是ascii,所以在decode()时或者在unicode()时会报错,因为没有指定编码参数,会采用系统默认编码,所以应该unicode(a,'utf-8') 或者a.decode('utf-8'),还有一种用到系统默认编码
import sys
reload(sys)
print sys.getdefaultencoding()
a = '罗'
b = u'慧'
c = a + b
结果
Traceback (most recent call last):
File "C:/Users/51613/Desktop/Myfirstprogram/1.py" , line 7 , in <module>
c = a + b
UnicodeDecodeError: 'ascii ' codec can't decode byte 0xe7 in position 0 : ordinal not in range (128 )
在unicode与str相加是会报错,因为默认会把str decode成unicode在加,编码采用的是系统默认编码。所以还需要设置默认编码或者提前将str 解码成unicode。
办法1:解码
import sys
reload(sys)
print sys.getdefaultencoding()
a = '罗'
b = u'慧'
c = unicode(a,'utf-8' ) + b
print c
结果:
ascii
罗慧
用unicode()或者decode()解码
办法2:设置系统默认编码
import sys
reload(sys)
sys.setdefaultencoding('utf-8' )
print sys.getdefaultencoding()
a = '罗'
b = u'慧'
c = a + b
print c
结果
utf-8
罗慧
常见错误,编码错误UnicodeEncodeError,解码错误UnicodeDecodeError,如果一个str类型的字符串来自网络或者是文件,最好先按照原有的编码格式decode成unicode在操作时使用,在传输或者持久化时在encode。
py3 字符串也有两种形式byte和str(unicode)
b'\xe7\xbd\x97' '罗'
str ————》encode————》byte
str 《———— decode 《———— unicode
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
系统默认编码就是utf-8,所以在网络传输或者读取文件时的默认解码utf-8的,还是,如果一个str类型的字符串来自网络或者是文件,最好先按照原有的编码格式decode成unicode在操作时使用,在传输或者持久化时在encode。