python3报错处理:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-4: ordinal not in range(128)
一、报错场景
// 报错代码
Traceback (most recent call last):
File "test_autoo3_2.py", line 214, in <module>
main()
File "test_autoo3_2.py", line 203, in main
print("\u8bc6\u522b\u6b63\u786e\u6570:", len(right), "\u8bc6\u522b\u9519\u8bef\u6570\uff1a", len(error))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
二、原因分析
Python3更换为默认使用Unicode(utf-8)编码,一直使用下来再没有遇到编码问题带来的困挠,似乎编码问题在Python3时代就该完全消失的。但这两天遇到了一个问题。
print()相当于把字符串从内存传输到了tty上,所以print()是需要encode()动作的;平时我们print()时一般都不需要encode(),只是因为当print()检测到传来的参数是不是byte类型时自动进行了编码。
Python3默认使用的是utf-8,这可以通过sys.getdefaultencoding()进行确认。但这只是默认,当系统配置了LC_ALL、LC_CTYPE、LANG等环境变量时(三者优先级从高到低),Python3采用这些变量配置的编码;如果这些变量配置的是utf-8那Python3用的就还是utf-8,但如果不是utf-8那Python3所用的也就不是utf-8了。
三、解决方法
方法一
// 在文件前加上以下几句代码
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
方法二
先编好码再交给print()
// An highlighted block
# -*- coding: utf-8 -*-
方法三
先编好码再交给print()
// An highlighted block
print("中文".encode(encoding="utf-8"))
方法四
直接在Python中重新设置标准输出编码
import sys
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
print("中文")