字节格式Unicode字符串打印问题:输出d’int失败与emacs排查
解决Python字节串解码后在Emacs中打印触发UnicodeEncodeError的问题
问题回顾
你有一个从数据库读取的字节串 b'd\xe2\x80\x99int',想要解码并打印成带弯引号的字符串 d’int,但执行 print(b'd\xe2\x80\x99int'.decode('utf-8')) 时触发了如下错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 1: ordinal not in range(128)
后来你也发现了,问题根本不在Python代码本身,而是出在Emacs的编码配置上——这确实和Unicode相关文档描述的场景完全一致。
解决方案
Emacs默认可能会把Python交互进程的输出编码设置为ASCII,导致无法处理Unicode字符,下面是两种解决方式:
临时修复(当前缓冲区生效)
在Emacs的Python交互缓冲区中,按下 M-:(Alt+冒号),输入以下Lisp代码并回车:
(set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix)
这会立即将当前Python进程的输入、输出编码都设置为UTF-8,之后再运行你的print语句就能正常显示d’int了。
永久配置(所有Python模式缓冲区生效)
如果你不想每次都手动设置,可以把以下代码添加到你的Emacs配置文件(比如~/.emacs或者~/.emacs.d/init.el)中:
(add-hook 'python-mode-hook (lambda () (setq buffer-process-coding-system '(utf-8-unix . utf-8-unix))))
这样每次打开Python模式的缓冲区时,Emacs都会自动为关联的Python进程配置UTF-8编码,彻底解决这个问题。
额外验证
你也可以在Python中检查输出编码是否生效,执行以下代码:
import sys print(sys.stdout.encoding)
设置正确后,输出应该是utf-8,而不是之前的ascii。
内容的提问来源于stack exchange,提问作者Nisba
相关产品推荐
相关产品推荐

