python字符编码使用什么编码_理解Python字符集编码

Python编码的前世今生,在python中和字符串相关的类型,分别是str,unicode两种不同的类型:

basestring

|

+--str

|

+-- unicode

脚本字符编码

脚本字符编码指脚本文件本身是用何种字符编码的,默认情况下Python解释器(解释器就是执行python代码的程序)把脚本当作ascii码来处理:

#test.py

print "你好"

上面是test.py脚本,运行 python test.py 就会包如下错误:

File “test.py”, line 1

yntaxError: Non-ASCII character ‘\xe4′ in file test.py on line 1, but no encoding declared; see http://www.python.org/

ps/pep-0263.html for details

所以如果文件中要使用非ascii编码的字符串,就必须在文件头部声明:

#coding=utf8

#或者

# coding=gb18030

这样就相当于告诉python解释器使用utf8编码或者gb18030来解释脚本文件。

解释器 字符编码

解释器字符编码是指解释器内部认为的str类型的字符串的编码,也就是说python解释器会把str类型的字符串当作何种字符编码来处理。默认,python解释器字符编码也是ascii的。可以通过命令查看:

>>> sys.getdefaultencoding()

'ascii'

不同的字符编码集如utf-8、gbk、iso8859-1等等的字符串(注:这些字符编码集都是针对str类型的字符串而言的,unicode字符串没有字符集这类说法)之间相互转换是怎么进行的呢?答案就是他们通过一个中间桥梁unicode来转换,相关的两个方法是decode和encode。

#从str类型的字符串转换到unicode

s.decode(encoding) =====> to

#从str类型的字符串转换到unicode

u.encode(encoding) =====> to

问题:现在假设我想要把一个gbk字符编码的str对象转换为utf-8的str对象,该如何转换呢?

现在默认我是在windows下操作,操作系统的字符编码默认是gbk的,

>>> s="你好"

>>> s

'\xc4\xe3\xba\xc3'

>>> len(s)

4

gbk字符编码的两个中文的长度是4,如果是utf-8编码的字符串“你好”的长度是6,稍后我们把“你好”转换成utf-8的看看是不是长度为6。

首先我们要先把”s”转换成unicode,在从unicode转换成utf-8编码的str对象:

>>> s1 = s.decode('gbk').encode('utf-8')

>>> s1

'\xe4\xbd\xa0\xe5\xa5\xbd'

>>> len(s1)

6

>>>

实验证明s1就是一个utf-8编码的str类型的字符串对象。

str(S)与unicode(S)

str(s)和unicode(s)是两个工厂方法,分别返回str字符串对象和unicode字符串对象,str(s)是s.encode(‘ascii’)的简写。实验:

>>> s3 = u"你好"

>>> s3

u'\u4f60\u597d'

>>> str(s3)

Traceback (most recent call last):

File "", line 1, in

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

上面s3是unicode类型的字符串,str(s3)相当于是执行s3.encode(‘ascii’),前面介绍过python解释器默认字符编码是’ascii’的,之所以报错是因为转换后的s3里面含有非ascii字符(ascii只能表示0-127之间的ascii码字符)。所以就报错了,正确的指定编码:s3.encode(‘gbk’)就不会出现这个问题了。类似的unicode有同样的错误:

>>> s4 = "你好"

>>> unicode(s4)

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

>>>

unicode(s4)等效于s4.decode(‘ascii’),而这里s4是gbk字符编码的(因为我的操作系统默认编码是gbk),因此要正确的转换就要正确指定其编码s4.deocde(‘gbk’)。

更新

对于如unicode形式的字符串(str类型):

s = 'id\u003d215903184\u0026index\u003d0\u0026st\u003d52\u0026sid’

转换成真正的unicode需要使用:

s.decode('unicode-escape')

测试:

>>> s = 'id\u003d215903184\u0026index\u003d0\u0026st\u003d52\u0026sid\u003d95000\u0026i'

>>> print(type(s))

>>> s = s.decode('unicode-escape')

>>> s

u'id=215903184&index=0&st=52&sid=95000&i'

>>> print(type(s))

>>>

有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

weixin.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值