疑惑來源
Vim 編寫 `.py` 文件,`print("中文")` 報錯 `SyntaxError: Non-UTF-8 code starting with ...`。網上說加 `# -*- coding: utf-8 -*-` 解決,但 `#` 不是註釋嗎?為什麼生效?
真相:這是「編碼聲明」,Python 解釋器專門識別
- **PEP 263** 規定:源文件**前兩行**匹配正則 `^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)` 即視為編碼聲明。
- 解釋器在**詞法分析前**讀取原始字節流,解析該行,確定文件編碼,**然後**才按該編碼解碼後續內容。
- 對不支持的解釋器,它就是普通註釋,**向後兼容**。
寫法規範
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 或
# vim: set fileencoding=utf-8 :
- 必須在**第 1 或第 2 行**(若有 Shebang 則第 2 行)。
- 推薦 `utf-8`,也可 `gbk`, `latin-1` 等。
- Python 3 默認源文件編碼即為 UTF-8,**通常可省略**,但顯式聲明無害且利於跨環境一致性。
同類「註釋指令」跨語言對比
| 語言/工具 | 指令示例 | 作用 |
| HTML | `` | IE 條件註釋,僅 IE 執行 |
| C/C++ | `#pragma once` / `#pragma pack(1)` | 預處理器指令,控制編譯行為 |
| JavaScript | `//# sourceMappingURL=...` | Source Map 映射 |
| TypeScript | `// @ts-nocheck` | 關閉類型檢查 |
| Python | `# type: ignore` | mypy 靜態檢查忽略 |
最佳實踐
- **文件保存為 UTF-8 無 BOM**(VS Code / Vim / PyCharm 默認)。
- 頂部保留編碼聲明,防止舊版 Python / 某些 IDE 誤判。
- 字符串字面量直接寫中文,運行時確保終端/控制台編碼一致(Windows `chcp 65001` 或配置 IDE 運行編碼)。
**結論**:`# -*- coding: utf-8 -*-` 看起來像註釋,實為**解釋器元指令**,體現了「約定優於配置」的工程智慧。
- 上一篇文章: Spring MVC 實現「記住我」自動登錄:Cookie + Token 方案完整架構
- 下一篇文章: Java 遺留系統重構實戰:從單體大泥球到多模組微服務化架構演進
Copyright ©
程式碼之家 All Rights Reserved