Unicode 和编码

从 Pygments 0.6 开始,所有的词库在内部使用 unicode 字符串。正因为如此,如果你传递编码错误的字符串,你可能偶尔会遇到 UnicodeDecodeError

默认情况下,所有词库的输入编码都设置为 guess。这意味着将尝试以下编码:

  • UTF-8 (包括 BOM 处理)

  • 本地化编码(即 locale.getpreferredencoding() 的结果)

  • 作为最后的手段,latin1

如果你向 lexer 传递一个字节字符串对象(不是 unicode),它就会尝试使用这个编码对数据进行解码。

你可以使用 encodinginencoding 解析器选项覆盖编码。如果你安装了 chardet 库,并将编码设置为 chardet,那么它将分析文本并自动使用它认为正确的编码:

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

最好的方法是传递 Pygments unicode 对象。在这种情况下,你不可能得到意外的输出。

如果你不设置输出编码,格式化器现在将 Unicode 对象发送到流中。你可以通过传递给格式化器一个 encoding 选项来实现:

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

如果你的源文件中有非 ASCII 字符,而输出流不接受 Unicode 写入,你就必须设置这个选项! 所有常规文件和终端都是这种情况。

注意:终端格式化器试图变得聪明:如果它的输出流有一个 encoding 属性,而你没有设置该选项,它将在写入任何 Unicode 字符串之前用该编码进行编码。例如,sys.stdout 就是这种情况。其他格式化器没有这种行为。

另一个说明:如果你通过命令行调用 Pygments(pygmentize),编码的处理方式是不同的,见 命令行文档

0.7 新版功能: 格式化器现在也接受一个 outencoding 选项,如果给出的话,它将覆盖 encoding 选项。这使得使用单一选项的 lexer 和格式化器成为可能,但仍有不同的输入和输出编码。