python2中编码问题

1. Python 3 中 str 与 bytes

在 Python3中,字符串有两种类型 ,str和bytes。

  • unicode string(str 类型):以 Unicode code points 形式存储,人类认识的形式
  • byte string(bytes 类型):以 byte 形式存储,机器认识的形式

在 Python 3 中你定义的所有字符串,都是 unicode string类型,使用 type 和 isinstance 可以判别

# python3
>>> str_obj = "你好"
>>> type(str_obj)
<class 'str'>
>>> isinstance("你好", str)
True
>>> isinstance("你好", bytes)
False

bytes是一个二进制序列对象,只要在定义字符串时前面加一个b,就表示bytes类型的字符串对象。

# python3
>>> byte_obj = b"Hello World!"
>>> type(byte_obj)
<class 'bytes'>
>>> isinstance(byte_obj, str)
False
>>> isinstance(byte_obj, bytes)
True

但是在定义中文字符串时,如果直接加上b,就会报错,应该使用encode转码一下。

>>> byte_obj=b"你好"
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> str_obj="你好"
>>> str_obj.encode("utf-8")
b'\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd'

2. Python 2 中 str 与 unicode

在Python2里,字符串也只有两种类型,unicode和str。

  • unicode string(unicode类型):以Unicode code points形式存储,人类认识的形式
  • byte string(str 类型):以byte形式存储,机器认识的形式

当我们直接使用双引号或单引号包含字符的方式来定义字符串时,就是 str 字符串对象

# python2
>>> str_obj="你好"
>>> type(str_obj)
<type 'str'>
>>> isinstance(str_obj, bytes)
True
>>> isinstance(str_obj, str)
True

而当我们在双引号或单引号前面加个u,就表明我们定义的是 unicode 字符串对象

# python2
>>> unicode_obj = u"你好"
>>> type(unicode_obj)
<type 'unicode'>
>>> isinstance(unicode_obj, bytes)
False
>>> isinstance(unicode_obj, str)
False

3. 如何检测对象的编码

所有的字符,在 unicode 字符集中都有对应的编码值。

把这些编码值按照一定的规则保存成二进制字节码,就是我们说的编码方式,常见的有:UTF-8,GB2312 等。

4. 编码与解码的区别

编码和解码,其实就是str与bytes的相互转化的过程,我们这里只说python3的

  • 编码 :encode方法,把字符串对象转化为二进制字节序列
  • 解码 :decode方法,把二进制字节序列转化为字符串对象

5. 如何设置文件编码

在Python 2中,默认使用的是 ASCII 编码来读取的,因此,我们在使用Python 2的时候,如果你的python文件里有中文,运行是会报错的。

而在 Python 3 中,默认使用的是 uft-8 来读取,所以省了不少的事。

对于这个问题,通常解决方法有两种:

第一种方法

在 python2 中,可以在文件头部指定编译器读取源码时采取的编码和解码方式

# -*- coding: utf-8 -*- 
# coding:utf-8
# coding=utf-8 

以上三种书写方式,任选一种即可

第二种方法

import sys 

reload(sys) 
sys.setdefaultencoding('utf-8') 

这里在调用sys.setdefaultencoding(‘utf-8’) 设置默认的解码方式之前,执行了reload(sys),这是必须的,因为python在加载完sys之后,会删除 sys.setdefaultencoding 这个方法,我们需要重新载入sys,才能调用 sys.setdefaultencoding 这个方法。

完结撒花,有疑问留言探讨哈~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值