编码

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
解决:
# -*- coding:utf-8 -*-
a = '罗'
b =a.decode('utf-8')
print b
通过# -*- coding:utf-8 -*-  告诉解释器,编译和存储这个文件的所有str用utf-8,没有这句就算是注释里有中文,也会报错。
但是
# -*- coding: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'),还有一种用到系统默认编码
# -*- coding: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:解码
# -*- coding:utf-8 -*-
import sys
reload(sys)
print sys.getdefaultencoding()
a = '罗'
b = u'慧'
c = unicode(a,'utf-8') + b
print c
 结果:
ascii
罗慧
用unicode()或者decode()解码
办法2:设置系统默认编码
# -*- coding:utf-8 -*-
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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值