在 Ubuntu 下使用 Python 时经常会遇到编码错误(UnicodeEncodeError / UnicodeDecodeError),通常不是 Python 本身“有 bug”,而是环境、终端、文件、系统区域设置不一致导致的。下面按常见原因给你说清楚。
Ubuntu 默认有时会用:
LANG=C
LC_ALL=C
或者 POSIX,这时 Python 默认编码不是 UTF-8。
检查:
locale
如果看到:
LANG=C
LC_CTYPE=C
就非常容易出编码问题。
sudo apt install locales
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8
或英文环境:
sudo update-locale LANG=en_US.UTF-8
重新登录终端后:
python3 -c "import sys; print(sys.stdout.encoding)"
# 应该输出 utf-8
典型错误:
UnicodeEncodeError: 'ascii' codec can't encode characters
原因:
sys.stdout.encoding 是 ANSI_X3.4-1968(即 ASCII)export PYTHONIOENCODING=utf-8
写入 ~/.bashrc:
export PYTHONIOENCODING=utf-8
❌ 错误写法:
with open("a.txt") as f:
f.read()
在 Ubuntu 上可能用 UTF-8 或 ASCII 解码,中文直接炸。
✅ 正确写法:
with open("a.txt", encoding="utf-8") as f:
f.read()
写文件同理:
with open("a.txt", "w", encoding="utf-8") as f:
f.write("中文")
如果是 Python 2:
print "中文" # 直接报错
Python 2 默认是字节串(str = bytes),不是 Unicode。
✅ 解决:
# -*- coding: utf-8 -*-
print u"中文"
如果你用:
终端编码不是 UTF-8,也会炸。
echo $LANG
cron 环境下:
LANG 可能没有
PYTHONIOENCODING 没有
在脚本里加:
import sys
reload(sys) # Python2
sys.setdefaultencoding("utf-8")
(Python3 不推荐)
或直接:
PYTHONIOENCODING=utf-8 python3 xxx.py
locale
echo $LANG
python3 -c "import sys; print(sys.stdout.encoding)"
python3 -c "open('t.txt', encoding='utf-8')"
Ubuntu 上 Python 编码错,90% 是因为 locale 不是 UTF-8 或没指定 encoding。
如果你愿意,可以把具体报错信息贴出来,我可以精准告诉你哪一步出问题。