你有没有遇到过这种情况:自己电脑上运行得好好的 Python 脚本,把结果存成 txt 文件,发到同事或朋友的电脑上打开,中文全变成了“锟斤拷”或者一堆问号?更崩溃的是,你的代码在 Mac 上好好的,到了 Windows 上保存的中文文件直接乱码。你查了半天 Stack Overflow,最后发现是编码在搞鬼。
对很多编程新手来说,'编码'这两个字简直就是玄学。你明明写的是'中文',结果 Python 一保存就变成了'浣犲ソ'。今天这篇文章,我就用一个刚刚发布的变化,帮你把这个痛点彻底解决。
新手最崩溃的瞬间:代码在别人电脑上乱码
先讲一个特别常见的场景。你刚学会用 Python 写爬虫,把抓到的标题、价格、评论一股脑写进一个 txt 文件:
with open("result.txt", "w") as f:
f.write("商品价格:99元")
这段代码在你电脑上跑得挺好,打开文件也能看到中文。但是!你把文件发给 Windows 上的同事,或者部署到 Linux 服务器上,再打开一看,可能全是乱码。
为什么会这样?因为 Python 的 open() 函数在不指定 encoding 的时候,会'看菜下饭':
在 Windows 上,它可能默认用 GBK;在 macOS 和 Linux 上,默认用 UTF-8。你写文件和读文件的环境不一样,中文就'翻译'错了。
所以老手的代码里一般都会写:
with open("result.txt", "w", encoding="utf-8") as f:
f.write("商品价格:99元")
但问题是,新手很容易忘记加 encoding="utf-8",因为课本和视频里经常不讲这个细节。等到项目跑到别人机器上出问题,排查起来非常浪费时间。
Python 3.15 改了什么?默认编码从'随缘'变 UTF-8
就在前几天,Python 3.15 的第三个测试版(3.15.0b3)发布了。其中有一个对新手特别友好的改动,就是 PEP 686:默认编码改为 UTF-8。
简单来说,从 Python 3.15 开始,不管你用的是 Windows、macOS 还是 Linux,open() 默认都会使用 UTF-8 编码。也就是说,上面那段容易出问题的代码,在 3.15 里反而能稳定输出中文了。
你可以这样理解:
# Python 3.14 及更早版本
open("a.txt") # 编码看系统心情:Windows 可能是 gbk
# Python 3.15 起
open("a.txt") # 默认就是 utf-8,跨平台一致
这个改动听起来很小,但对新手的影响非常大。它解决了一个隐藏很深的环境差异问题,让你可以把更多精力放在学语法、写逻辑上,而不是被莫名其妙的乱码折磨。
而且不只是 open(),Python 3.15 还把很多和编码相关的默认行为统一成了 UTF-8。比如标准输入输出、文件名处理等场景,都会更稳定。
你现在能怎么提前用?两行代码搞定兼容
我知道,大部分新手暂时还不会升级到 Python 3.15。那在旧版本上怎么避免乱码?记住下面这三招就行。
第一招:open() 永远显式写 encoding。
这是最稳妥、最推荐的做法。不管你是读文件还是写文件,都养成加 encoding="utf-8" 的习惯:
# 写文件
with open("output.txt", "w", encoding="utf-8") as f:
f.write("中文内容")
# 读文件
with open("output.txt", "r", encoding="utf-8") as f:
text = f.read()
这个习惯一养成,不管以后用哪个 Python 版本,基本都不会被乱码坑。
第二招:用 pathlib 更省心。
Python 3.6 之后引入了 pathlib,读写文件可以更简洁:
from pathlib import Path
p = Path("output.txt")
p.write_text("中文内容", encoding="utf-8")
text = p.read_text(encoding="utf-8")
它的好处是参数一目了然,不容易漏写 encoding。
第三招:临时设置环境变量。
如果你正在跑一个别人的老项目,代码里没写 encoding,可以在运行前加个环境变量:
# Windows PowerShell
$env:PYTHONIOENCODING = "utf-8"
python main.py
# macOS / Linux
export PYTHONIOENCODING=utf-8
python main.py
这能让当前终端的 Python 输入输出都按 UTF-8 处理,算是个临时救急的办法。
老项目升级要注意这3个坑
Python 3.15 默认 UTF-8 确实很方便,但如果你要升级老项目,下面这几个坑还是要提前知道。
坑1:生产环境没升级,默认行为不会变。
很多服务器还在用 Python 3.10、3.11。只要没升到 3.15,open() 的默认编码还是按系统来。所以别因为本机是 3.15 就偷懒不写 encoding,部署到线上照样可能乱码。
坑2:它只管运行时的默认编码,不管源文件编码。
如果你的 .py 文件本身不是 UTF-8 保存的,里面写了中文,运行时还是可能报 SyntaxError。所以编辑器保存文件时,记得选 UTF-8。
坑3:给别人发的文件要说明编码。
你用 UTF-8 写了个文件,对方用旧版 Excel 或者记事本默认 GBK 打开,依然会乱码。重要文件最好注明'请用 UTF-8 编码打开',或者用 UTF-8 with BOM 兼容部分 Windows 软件。
总之,Python 3.15 这个改动是个大好事,但不是万能药。养成显式指定编码的好习惯,才是彻底告别乱码的关键。
以上就是“Python 3.15 默认UTF-8来了!新手乱码问题有救了!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14271/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料