Python篇---# -*- coding: utf-8 -*- 声明

张开发
2026/4/19 4:46:55 15 分钟阅读

分享文章

Python篇---# -*- coding: utf-8 -*- 声明
简单来说# -*- coding: utf-8 -*-这行声明的作用就是告诉Python解释器“这个.py文件是用UTF-8编码保存的请按这个规则来读取它。”关于Windows和Linux下的差异最核心的原因在于Python 2与Python 3的默认编码不同以及操作系统默认编码的差异。下面我们来详细拆解一下。 为什么需要声明# -*- coding: utf-8 -*-这行代码的诞生主要为了解决Python 2时代的“中文乱码”噩梦。Python 2的“ASCII”固执Python 2解释器默认使用ASCII编码来读取.py文件。ASCII只支持英文和少数符号一旦代码里出现中文注释或字符串解释器就会立刻报错SyntaxError: Non-ASCII character...。Python 3的“UTF-8”转变到了Python 3情况彻底改变。Python 3默认使用UTF-8编码读取源文件。UTF-8是Unicode的通用实现完美支持中文等全球文字因此理论上不需要再声明。既然Python 3默认就是UTF-8为什么还总能看到这行声明呢兼容性“护身符”为了让同一个.py文件既能被Python 2运行也能被Python 3运行加上这行声明是一个好习惯。编辑器“定心丸”明确告知代码编辑器如VS Code、PyCharm“请用UTF-8打开我”避免编辑器用错误的编码如GBK打开文件导致显示乱码。️ 为什么Windows和Linux下有差异这背后的差异是Python 2时代“历史包袱”和系统默认编码不同共同作用的结果。1. Python 2 vs. Python 3根本原因在Python 2下由于默认编码是ASCII无论在Windows还是Linux只要文件中有中文就必须在文件头声明# -*- coding: utf-8 -*-。而Python 3默认UTF-8所以无论在Windows还是Linux不加这行声明通常也不会报错。2. Windows vs. Linux默认编码与BOM问题在Python 2时代现在可能仍会遇到Windows和Linux的表现会有所不同特性 Linux / macOSWindows系统默认编码多为UTF-8多为GBK/GB2312(中文环境)编辑器默认保存多为UTF-8(无BOM)可能是GBK(如老版记事本) 或UTF-8Python 2下风险相对较低但文件含中文仍需声明风险较高。用记事本保存后文件实际是GBK编码。代码中声明utf-8会与实际编码不符导致报错或乱码什么是BOMBOM是藏在文件开头的几个特殊字符\xef\xbb\xbf用于标记这是个UTF-8文件。Windows记事本保存的“UTF-8”文件默认带BOM。而Linux下的UTF-8文件通常不带BOM。虽然Python 3能识别BOM但它有时会带来麻烦因此跨平台开发通常建议使用“无BOM的UTF-8”。 PEP 263不止一种写法所有这些规则都源于2001年提出的PEP 263。这个提案规定Python通过正则表达式^[ \t\v]*#.*?coding[:][ \t]*([-_.a-zA-Z0-9])来识别编码声明。这意味着除了常见的# -*- coding: utf-8 -*-下面几种写法同样合法# coding: utf-8 # codingutf-8 # encoding: utf-8 # vim: set fileencodingutf-8不过# -*- coding: utf-8 -*-是应用最广泛、兼容性最好的一种。️ Mermaid 总结框图下图清晰地展示了这行魔法注释的来龙去脉和跨平台差异。✍️ 最佳实践与避坑指南统一标准无论用Python 2还是3都建议在文件头统一加上# -*- coding: utf-8 -*-并确保你的编辑器将文件保存为“UTF-8 无BOM”格式。Python 3也要注意即使Python 3默认UTF-8但在处理外部文件如open(file.txt)时Python仍可能依赖系统默认编码。在Windows上这可能引发问题。强烈建议在打开文件时显式指定编码# 推荐写法避免Windows下的GBK陷阱 with open(data.txt, r, encodingutf-8) as f: content f.read()Shebang 的位置如果你的脚本需要在Linux/macOS下直接运行如./script.py第一行会是#!/usr/bin/env python3。此时编码声明必须放在第二行。总的来说# -*- coding: utf-8 -*-这行声明的兴衰恰好是Python从2代走向3代、从英语世界走向全世界的缩影。

更多文章