python默认编码方式

本文介绍Python中字符串编码的处理方法,包括Unicode与不同编码间的转换、IDE中遇到的编码问题及解决办法,还提供了获取和修改Python默认编码的示例。

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

python得到系统默认编码方式
Python获取系统默认字符编码
首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串转换成gb2312编码。

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

如在UliPad中运行如下代码:

s=u"中文"
print s

会提示:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode(‘gb2312’)

则能正确输出“中文”两个字。

若最后一句改为:print s.encode(‘utf8’)

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。

另外,代码中字符串的默认编码与代码文件本身的编码一致,如:

s=‘中文’

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。 这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件,在这篇文章中可以看到如何获得系统的默认编码。

如果字符串是这样定义:

s=u’中文’

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

如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode) #用来判断是否为unicode


在Python代码中,普通字符串的编码方式与程序源文件编码方式一致的,而很多IDE在默认情况下,将程序源文件按照系统默认字符编码来保存的。

下面给出用Python获取系统默认编码的例子:

#!/usr/bin/env python
#coding=utf-8
"""
    获取系统默认编码
"""
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:

ascii 

***********************************

修改python默认的编码方式
今天碰到了 python 编码问题, 报错信息如下
Traceback (most recent call last):
  File "ntpath.pyc", line 108, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 36: ordinal not in range(128)

显然是当前的编码为ascii, 无法解析0xa1(十进制为161, 超过上限128). 进入python console后, 发现默认编码确实是 ascii, 验证过程为:

>>>import sys
>>>sys.getdefaultencoding()
#输出为ascii. 

#在使用 sys.setdefaultencoding('utf8'), 报错!
>>>sys.setdefaultencoding('utf8') 
AttributeError: 'module' object has no attribute 'setdefaultencoding' 

google 到一个 limodou 回复的帖子, http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=580942&page=15&view=collapsed&sb=5&o=

limodou讲到, sys.setdefaultencoding 方法在python导入 site.py 后就删除了, 不能再被调用了.  在确定sys已经导入的情况下, 可以reload sys这个模块, 之后, 再 sys.setdefaultencoding('utf8') 
>>>reload(sys)
>>>sys.setdefaultencoding('utf8') 

确实有效, 根据 limodou 讲解,  site.py 是 python 解释器启动后, 默认加载的一个脚本. 如果使用 python -S 启动的话, 将不会自动加载 site.py. 

上面写的挺啰嗦的. 

==================================
如何永久地将默认编码设置为utf-8呢?  有2种方法: 
==================================
第一个方法<不推荐>: 编辑site.py, 修改setencoding()函数, 强制设置为 utf-8 
第二个方法<推荐>: 增加一个名为 sitecustomize.py, 推荐存放的路径为 site-packages 目录下
sitecustomize.py 是在 site.py 被import 执行的, 因为 sys.setdefaultencoding() 是在 site.py 的结尾处被删除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding(). 
#file name:  sitecustomize.py
import sys  
sys.setdefaultencoding('utf-8')   

### Python `open` 函数编码方式 在处理文件读写操作时,Python 的 `open()` 函数允许指定字符编码来确保程序能够正确解读不同编码格式下的文本文件。默认情况下,当未指明编码参数时,`open()` 使用依赖于平台的默认编码,在许多 Unix 系统上这通常是 `'utf-8'` 而对于 Windows 则可能是 `'cp1252'` 或其他特定区域设置所对应的编码[^2]。 为了显式设定编码,可以在调用 `open()` 方法时通过传递名为 `encoding` 的关键字参数来进行配置: ```python with open('example.txt', 'r', encoding='utf_8') as file: content = file.read() print(content) ``` 上述代码片段展示了如何打开并读取一个 UTF-8 编码的文本文件。这里列举了一些常见的编码选项供选择,这些也出现在逐步检测文件编码格式的过程中提到过的列表里[^3]: - `'ascii'`: 基本ASCII集,仅支持英文字符。 - `'utf_8'`: 支持全球几乎所有语言的文字表示法,并且兼容 ASCII 字符串。 - `'utf_16'`, `'utf_16_le'`, `'utf_16_be'`: 变体形式的 Unicode 编码方案,适用于某些特殊场景下更高效的存储需求。 - `'cp1252'`: 微软Windows操作系统上的扩展拉丁字母表之一,常用于西欧语系国家和地区。 值得注意的是,如果尝试以错误的方式解码二进制数据流(比如网络协议中的 payload 数据),可能会遇到难以预料的问题。因此理解并正确应用编码规则非常重要[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值