UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-4: ordinal not in range(128)

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("中文")

猜你喜欢

转载自blog.csdn.net/m0_37882192/article/details/108972722
今日推荐