python 字符串内容
一、介绍python 2和python 3中的字符串类型及用途
python 2
str
简单文本(如ascii编码)和二进制数据(bytes)。
unicode
多字节文本(宽字符,如中文)。
python 3
str
unicode文本,包含ascii、utf-8等。
bytes
字节,用于二进制数据表示,在一些需要低级数据结构的时候用到,譬如C语言等。
bytearray
bytes类型的一个变体,它是可变的并且支持原处修改。
二、字符编码解码的基础知识及在python中的使用
编解码
编码:
根据一个想要的编码名称,把一个字符串翻译为其原始字节形式。
解码:
根据其编码名称,把一个原始字节串翻译为字符串形式的过程。
python 2中编解码对象的转换关系
decode encode
str ---------> unicode --------->str
示例:
s = '北京'
s.decode('gb2312')
s.decode('gb2312').encode(encoding='utf-8',errors='strict')
python 3中编解码对象的转换关系
decode encode
bytes ------> str(unicode)------>bytes
示例:
s = '北京'
s.encode()
b'\xe5\x8c\x97\xe4\xba\xac' #\为转义字符,x为十六进制的标记,u为unicode
s.encode().decode()
查看对象或平台的编码环境
1)检查python默认的编码
import sys
sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('utf8')
2)检查字符对象的编码,这个模块识别不准,可以参考链接
https://blog.csdn.net/u013314786/article/details/77931548
import chardet
print chardet.detect(html)
识别模块不太准的时候,可以使用decode采用一些常用的中文编码进行解码,如GBK,GB2312等。
三、python 2和python 3在字符串使用的上的一些区别
1)python 3默认采用utf-8的字符集,而python 2默认采用ascii的编码方式。
2)python 2中存在str和unicode类型,python 3分为bytes和str类型。
3)python 2的str类型可以表示二进制和字符串数据,而python 3中进行了区分
4)python 2和3版本中的编解码转换规则不太一样
python 2中进行编码转换,必须先转换为unicode对象
python 3由于本身就值unicode,所以可直接进行转换编码
5)文件读取
python 2
读取文件时,采用r和rb读取文件文件时,无区别。
读取文件时,直接读取字节再通过ascii解码,如果包含非ascii字符的打印为直接。
read方法输出指定字节数。
python 3
读取文本文件时,采用r和rb模式读取输出是不同的,rb输出字节,r输出字符。
读取时采用utf-8进行解码读取。
read方法输出字符数。
四、相关知识点
1)字节顺序标记BOM
例如,在UTF-16和UTF-32编码中,BOM指定大尾还是小尾格式(基本上,是确定一个位字符串的哪一端最重要)。
处理BOM的方法
在文件进行写入和读取时使用具体编码名来处理BOM,如下:
>>> open('spam.txt', 'r', encoding='utf-8-sig').read()
'spam\nSPAM\n' #使用具体的编码名处理BOM
2)转换编码
我们总是可以把一个字符串转换为不同于源字符集默认的一种编码,但是,我们必须显式地提供一个编码名称以进行编码和解码:
>>>S = 'AÄBèC'
>>>S.encode() # Default utf-8 encoding
b'A\xc3\x84B\xc3\xa8C'
>>>T = S.encode('cp500') #转换为cp500编码
3)源文件字符集编码声明
改变默认的文件编码形式,在文件的第一或第二行声明。
# -*- coding: latin-1 -*-
重点提示:
1、数据分层表示方法。
文件层面: 字节序列,可分为各类编码形式的字节序列,如unicode,base64,自定义的字节流。
python脚本文件层面: 字符序列,自动执行编码/解码操作。
python解释器内存层面:unicode码或字节码。