Unicode 與編碼

自 Pygments 0.6 版本開始,所有詞法分析器 (lexer) 內部都使用 Unicode 字串。因此,如果您傳遞了編碼錯誤的字串,您可能會遇到 UnicodeDecodeError 的錯誤。

預設情況下,所有詞法分析器的輸入編碼都設定為 guess。這表示會嘗試以下編碼:

  • UTF-8 (包含 BOM 處理)

  • 本地編碼 (即 locale.getpreferredencoding() 的結果)

  • 最後嘗試 latin1

如果您傳遞詞法分析器一個位元組字串物件 (而非 Unicode),它會嘗試使用此編碼來解碼資料。

您可以使用 encodinginencoding 詞法分析器選項來覆寫編碼。如果您安裝了 chardet 程式庫,並將編碼設定為 chardet,它將會分析文字,並自動使用它認為正確的編碼。

from pygments.lexers import PythonLexer
lexer = PythonLexer(encoding='chardet')

最好的方式是傳遞 Pygments Unicode 物件。在這種情況下,您不會得到意料之外的輸出。

如果您沒有設定輸出編碼,格式化器 (formatter) 現在會將 Unicode 物件傳送到串流。您可以透過傳遞格式化器 encoding 選項來設定輸出編碼。

from pygments.formatters import HtmlFormatter
f = HtmlFormatter(encoding='utf-8')

如果您的原始碼中包含非 ASCII 字元,且輸出串流不接受寫入其中的 Unicode,您必須設定此選項! 這是所有常規檔案和終端機的情況。

注意:終端機格式化器會嘗試變得聰明:如果其輸出串流具有 encoding 屬性,且您尚未設定該選項,它會在寫入之前使用此編碼來編碼任何 Unicode 字串。例如,sys.stdout 就是這種情況。其他格式化器沒有這種行為。

另一個注意:如果您透過命令列 (pygmentize) 呼叫 Pygments,編碼的處理方式會有所不同,請參閱 命令列文件

0.7 版本新增:格式化器現在也接受 outencoding 選項,如果提供此選項,將會覆寫 encoding 選項。這使得可以使用單一選項字典來設定詞法分析器和格式化器,並且仍然可以使用不同的輸入和輸出編碼。