python 字符串对象与编码

python中有两种字符串对象,即str和unicode。
一个简单的演示:
s1 = ‘abcdefg’
u1 = u’abcdefg’
print s1
print u1
type(s1)
type(u1)
返回得到:
abcdefg
abcdefg
<type ‘str’>
<type ‘unicode’>
可见,虽然s1和u1两个变量看似内容和输出一致,但是类型却完全不同。
它们二者的方法适用性也可能完全不同。当有报错提示,
ValueError: Expected a bytes object, not a unicode object
说明不能传入unicode对象,需要将unicode转换为str对象.

str和unicode互相转换

python内部常用unicode对象处理,比如io.read()方法返回的即为unicode对象,往往需要将其转换为str对象。有时也需要将str转换为unicode对象。仍以上述为例

str转换为unicode
u2 = s1.decode()
type(u2)
返回
<type ‘unicode’>
unicode转换为str
s2 = u1.encode()
type(s2)
返回
<type ‘str’>
注意,这里decode和encode方法没有传入编码参数,表示默认为“ASCII”编码。如果涉及到中文,常用的还有utf-8、gbk编码格式。
一个编码算例
例如,读取一个原始编码为utf-8的html文件,并转换为str对象
import io
with io.open(‘test.html’, ‘r’) as file:
html = file.read()
print type(html)
html = html.encode(‘utf-8’)
print type(html)
返回
<type ‘unicode’>
<type ‘str’>
关于print输出结果
文首算例中,为什么两个完全不同的对象,print出来的结果完全一致?
参照print函数说明文档:
““print“ evaluates each expression in turn and writes the resulting

object to standard output (see below).  If an object is not a string,
it is first converted to a string using the rules for string

conversions…….”
简单地说就是
print 函数默认输出返回值的字符串格式,如果返回的不是字符串,它会将其转换为字符串格式。简单理解:
function print(x):
#演示代码仅供理解,实际并非如此
return str(x)
所以,print返回的是转换为字符串后的结果,导致输出看起来是一样的,但实际上是完全不同的。
如何识别str对象的编码
chardet一款常用的识别编码的开源库(https://pypi.python.org/pypi/chardet)
安装
pip install chardet
识别
import chardet
str = ‘good’
chardet.detect(str)

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

CAPTCHA

*