首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Python 源文件編碼聲明:# -*- coding: utf-8 -*- 不是註釋,是指令

     編輯:程式設計疑難解答

疑惑來源

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,**通常可省略**,但顯式聲明無害且利於跨環境一致性。

同類「註釋指令」跨語言對比

最佳實踐

  1. **文件保存為 UTF-8 無 BOM**(VS Code / Vim / PyCharm 默認)。
  2. 頂部保留編碼聲明,防止舊版 Python / 某些 IDE 誤判。
  3. 字符串字面量直接寫中文,運行時確保終端/控制台編碼一致(Windows `chcp 65001` 或配置 IDE 運行編碼)。

**結論**:`# -*- coding: utf-8 -*-` 看起來像註釋,實為**解釋器元指令**,體現了「約定優於配置」的工程智慧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語言/工具指令示例作用
HTML``IE 條件註釋,僅 IE 執行
C/C++`#pragma once` / `#pragma pack(1)`預處理器指令,控制編譯行為
JavaScript`//# sourceMappingURL=...`Source Map 映射
TypeScript`// @ts-nocheck`關閉類型檢查
Python`# type: ignore`mypy 靜態檢查忽略