设计器执行 print() 语句提示编码错误的原因及解决办法

8.0 已经解决了这个问题。

—————
我们在设计器中打印一个含有中文的字符串时,经常会碰到 UnicodeEncodeError 错误,提示信息如下图所示:

设计器执行 print() 语句提示编码错误的原因及解决办法

首先要明确一点,python3 对文本以及二进制数据做了比较清晰的区分。在代码中赋值给变量的文本总是 Unicode,由 str 类型进行表示,而二进制数据使用 bytes 进行表示。

字符串在 Python3 内部 (源代码中直接赋值的文本) 表示统一用 unicode 编码,python3 中写字符串用下面两种方式是一样的,结果都是 unicode 编码, 也就是说在默认情况下,被引号框起来的字符串,都是使用 Unicode 编码的。

a = '我是a'
b = u'我是b'  # python2中的写法,在python3中跟不加u前缀是一样的

非 Unicode 编码格式的文本来源:从网络抓取的网页 / 硬盘文件等来源的字符串可能是比如 UTF-8、GBK,这些编码方式,得到这些数据时一般都是字节流,需要根据文件的编码方式选择对应的解码方式。


容易产生疑惑的地方

  • python3 默认编码为 utf-8,赋值字符串时默认编码为 unicode。似乎不太一样?

其实这两个不冲突,默认编码 utf-8 是编码解码字符串时没有传指定编解码参数时使用的默认编码,而 unicode 是源代码里赋值给变量字符串时使用的编码,直接放入内存,大概类似于内存编码


Python 涉及到编码的地方

.py 文件源代码的编码

写源代码时使用的编码是什么,比如中文 windows 记事本默认为 gb2312

编辑器使用哪种编码显示源代码

比如用记事本写源代码再用 pycharm 打开源代码可能就会乱码,因为 pycharm 默认是用 utf-8 显示的

运行界面显示文本的编码

一个脚本在 pycharm 下运行正常, 但到 cmd 下运行就出问题的情况


当使用 print 向运行界面打印信息时,是把这个字符串用默认编码转化成对应的字节给运行界面显示的, 如果你给的字符串编码是 unicode,那么系统会自动根据环境转成对应的 gbk 或 utf-8 去显示。但是如果你给的是 utf-8 然后丢给 cmd 显示,cmd 默认是 gbk 的编码字符,这个时候 print 就会报错。


明确了以上内容,我们可以分别输出一下 pycharm 以及设计器中 print 语句默认的输出编码格式:

import sys

print(sys.stdout.encoding)

在 pycharm 中输出为 utf-8,在设计器中输出为 cp936
cp936 其实就是 GBK,IBM 在发明 Code Page 的时候将 GBK 放在第 936 页,所以叫 cp936
设计器执行 print() 语句提示编码错误的原因及解决办法
我们可以打印一下系统默认编码,发现设计器输出栏的编码格式与系统默认编码一致:

>>> import locale
>>> locale.getdefaultlocale()  # 系统当前编码
('zh_CN', 'cp936')

那么我们只需要将这个默认输出编码格式改一下,就可以解决问题
在 print 语句之前加入如下代码:

import sys

sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='gb18030', buffering=1)

就可以在设计器中正常打印中文了!

gb18030 的含义参考https://blog.csdn.net/dataastron/article/details/79148574