加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入认识Python字符集编码

发布时间:2021-11-19 12:19:04 所属栏目:PHP教程 来源:互联网
导读:在Python中和字符串相关的类型,分别是str,unicode两种不同的类型: basestring | +--str | +-- unicode 脚本字符编码: 指脚本文件本身是用何种字符编码的,默认情况Python解释器(解释器就是执行python程序的程序)认为脚本是ascii码: #test.py print 你好

在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)   =====><type 'str'> to <type 'unicode'>
#从str类型的字符串转换到unicode
u.encode(encoding)  =====><type 'unicode'> to <type 'str'>
问题:现在假设我想要把一个gbk字符编码的str对象转换为utf-8的str对象,该如何转换呢?
 
现在默认我是在windows下操作,操作系统的字符编码默认是gbk的,
 
>>> s="你好"
>>> s
'xc4xe3xbaxc3'
>>> len(s)
4
gbk字符编码的两个中文的长度是4,如果是utf-8编码的字符串“你好”的长度是6,稍后我们把“s”转换成utf-8的看看是不是长度为6。
 
首先我们要先把”s”转换成unicode,在从unicode转换成utf-8编码的str对象:
 
>>> s1 = s.decode('gbk').encode('utf-8')
>>> s1
'xe4xbdxa0xe5xa5xbd'
>>> 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'u4f60u597d'
>>> str(s3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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 = 'idu003d215903184u0026indexu003d0u0026stu003d52u0026sid’
转换成真正的unicode需要使用:
 
s.decode('unicode-escape')
测试:
 
>>> s = 'idu003d215903184u0026indexu003d0u0026stu003d52u0026sidu003d95000u0026i'
>>> print(type(s))
<type 'str'>
>>> s = s.decode('unicode-escape')
>>> s
u'id=215903184&index=0&st=52&sid=95000&i'
>>> print(type(s))
<type 'unicode'>
>>>

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读