温馨提示×

ubuntu为何python编码错

小樊
60
2026-09-07 12:27:42
栏目: 编程语言

在 Ubuntu 下使用 Python 时经常会遇到编码错误(UnicodeEncodeError / UnicodeDecodeError),通常不是 Python 本身“有 bug”,而是环境、终端、文件、系统区域设置不一致导致的。下面按常见原因给你说清楚。


一、最常见原因:系统 locale 不是 UTF-8

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

二、Python 输出到终端时报错

典型错误:

UnicodeEncodeError: 'ascii' codec can't encode characters

原因:

  • 终端编码 ≠ UTF-8
  • sys.stdout.encoding 是 ANSI_X3.4-1968(即 ASCII)

临时解决

export PYTHONIOENCODING=utf-8

永久解决

写入 ~/.bashrc:

export PYTHONIOENCODING=utf-8

三、文件读写没指定 encoding

❌ 错误写法:

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 vs Python 3(老系统)

如果是 Python 2:

print "中文"   # 直接报错

Python 2 默认是字节串(str = bytes),不是 Unicode。

✅ 解决:

  • 用 Python 3(强烈建议)
  • 或显式:
# -*- coding: utf-8 -*-
print u"中文"

五、SSH / 远程终端编码问题

如果你用:

  • PuTTY
  • Xshell
  • 远程服务器

终端编码不是 UTF-8,也会炸。

检查

echo $LANG

设置终端

  • PuTTY:Window → Translation → UTF-8
  • Xshell:编码 → UTF-8

六、cron / systemd 里跑 Python 编码错

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。

如果你愿意,可以把具体报错信息贴出来,我可以精准告诉你哪一步出问题。

0 踩