Python——UnicodeEncodeError: 'ascii' codec can't encode/decode characters

本文详细介绍了在Python编程中遇到的编码问题,包括UnicodeEncodeError和UnicodeDecodeError,并提供了设置默认编码的方法,如在程序中加入`import sys; reload(sys); sys.setdefaultencoding('utf8')`或在`site-packages`目录下创建`sitecustomize.py`文件。此外,还讨论了如何一次性修改程序或系统的默认编码,以及避免大量错误报告的替代方案。

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

初学Python被编码格式搞的很头大,以下bug是遇到的编码问题之一:

【BUG】UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)或者UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)

python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错,python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式。

查询系统默认编码可以在解释器中输入以下命令:

Python代码   收藏代码
  1. >>>sys.getdefaultencoding()  

设置默认编码时使用:

Python代码   收藏代码
  1. >>>sys.setdefaultencoding('utf8')  

 可能会报AttributeError: 'module' object has no attribute 'setdefaultencoding'的错误,执行reload(sys),在执行以上命令就可以顺利通过。

此时在执行sys.getdefaultencoding()就会发现编码已经被设置为utf8的了,但是在解释器里修改的编码只能保证当次有效,在重启解释器后,会发现,编码又被重置为默认的ascii了,那么有没有办法一次性修改程序或系统的默认编码呢。

 

有2种方法设置python的默认编码:

一个解决的方案在程序中加入以下代码:

Python代码   收藏代码
  1. import sys  
  2. reload(sys)  
  3. sys.setdefaultencoding('utf8')   

 另一个方案是在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:

Python代码   收藏代码
  1. # encoding=utf8  
  2. import sys  
  3.   
  4. reload(sys)  
  5. sys.setdefaultencoding('utf8')   

此时重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。

 

另外有一种解决方案是在程序中所有涉及到编码的地方,强制编码为utf8,即添加代码encode("utf8"),这种方法并不推荐使用,因为一旦少写一个地方,将会导致大量的错误报告。

【转】http://shirley-ren.iteye.com/blog/1018750

### 解决 Python 中 `UnicodeEncodeError` 错误的方法 当在 Python 环境下处理包含非 ASCII 字符(如中文字符)的数据时,可能会遇到 `UnicodeEncodeError: 'ascii' codec can't encode characters` 这类错误。此错误表明程序尝试使用默认的 ASCII 编码来写入或发送数据,而这些数据包含了超出 ASCII 范围的字符。 #### 方法一:设置环境变量 通过设定环境变量 `PYTHONIOENCODING` 来指定标准输入/输出流使用的编码方式可以有效解决问题。具体命令如下所示: ```bash $ PYTHONIOENCODING=utf-8 python simple.py 参数名 ``` 这会强制解释器以 UTF-8 方式读取和写出字符串[^1]。 #### 方法二:更改源文件头部声明 如果是在编写脚本的过程中遇到了这个问题,则可以在 Python 源代码的第一行加入以下语句,从而显式指明整个文档采用的是哪种编码格式: ```python # - coding:utf-8 -*- ``` 这样做可以让解析器知道该怎样正确解读后续可能出现的各种特殊字符[^4]。 #### 方法三:调整 sys.stdout.encoding 属性 对于某些特定场景下的应用来说,可能更倾向于动态改变当前进程的标准输出对象所关联的编码属性。可以通过导入并操作 `sys` 库中的相应成员实现这一点: ```python import sys if hasattr(sys, "setdefaultencoding"): reload(sys).setdefaultencoding('utf8') else: import importlib.reload as reload reload(sys) sys.setdefaultencoding('utf8') # 不推荐用于生产环境中 ``` 需要注意的是,在实际开发过程中不建议随意修改全局默认编码配置,因为这可能导致难以预料的行为和其他潜在兼容性问题的发生[^3]。 #### 方法四:捕获异常并转换编码 最后一种常见做法就是在发生异常时手动捕捉它,并利用内置函数或其他第三方库来进行必要的编码转换工作。例如: ```python try: print("阳光下的小海儿") except UnicodeEncodeError as e: str_with_utf8 = u"{}".format("阳光下的小海儿").encode('utf-8').decode() print(str_with_utf8) ``` 上述例子展示了如何优雅地处理此类异常情况的同时保持良好的用户体验[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值