Python资料之编码问题

本文介绍了Python中关于编码的重要概念,包括如何通过# -- coding: utf-8 --声明文件编码,Python 3.x的默认编码,以及处理非ASCII字符的编码转换。强调了Python源码文件应使用单一编码,并解释了Python内部使用unicode编码存储字符串。同时,讨论了在IDE中可能出现的乱码问题以及如何获取系统默认编码。提供了unicode函数和编码处理的参考脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

◆ 编码声明:
# -- coding: utf-8 --

必须放在python文件的第一行或第二行,是用来指定文件的编码为 utf-8 的。(python 3.0以后默认就用utf-8,无需再做编码声明)

如果没有此文件编码类型的声明,则 python 默认以ASCII编码去处理;如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的 python 文件,自然就会报错了。

支持的格式,可以有三种:

★ 带等于号的:# coding=<encoding name>

★ 最常见的,带冒号的(大多数编辑器都可以正确识别的):
#!/usr/bin/python
# -*- coding: <encoding name> -*-

★ vim的:
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :


◆ python文件编码声明所遵循的理念:

1.单个的完整的python源码文件中,只用单一的编码。

不允许嵌入了多种的编码的数据,否则会导致(python解释器去解析你的python文件时)报编码错误。

2.Python的分词器+编译器,会按照如下的逻辑去工作:

读取文件
不同的文件,根据其声明的编码去解析为Unicode
转换为UTF-8字符串
针对UTF-8字符串,去分词
编译之,创建Unicode对象


要注意的是:Python中的标识符,都是ASCII的。

◆ 关于python的编码:

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

1、 pyhton的所有内置库、方法接受的是unicode编码的字符串。
2、str.decode 函数就是转成unicode编码,所以能decode的字符串传级python的内置库、函数都能正确运行。
3、问题在于这个decode函数解码时到底要传哪个参数:utf-8,gbk,gb2312......等N种编码。参数不当,就会抛类似异常:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data

如果字符串是这样定义:s=u’中文’,则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。

◆ 获得系统的默认编码

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。

print s.encode('utf8'),若输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。

◆ unicode函数:

unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码


◆ 编码处理参考脚本:

#!/usr/bin/env python 
#coding=utf-8 
s="中文" 

if isinstance(s, unicode): 
#s=u"中文" 
print s.encode('gb2312') 
else: 
#s="中文" 
print s.decode('utf-8').encode('gb2312')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值