Unicode 和编码

从 Pygments 0.6 开始,所有词法分析器在内部使用 unicode 字符串。因此,如果您传递了编码错误的字符串,您可能会偶尔遇到 UnicodeDecodeError

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

  • UTF-8(包括 BOM 处理)

  • 区域设置编码(即 locale.getpreferredencoding() 的结果)

  • 最后,latin1

如果您向词法分析器传递字节字符串对象(而不是 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 就是如此。其他格式化程序没有这种行为。

另一个注意事项:如果您通过命令行(pygmentize)调用 Pygments,编码的处理方式不同,请参阅 命令行文档.

在版本 0.7 中添加: 格式化程序现在也接受一个 outencoding 选项,如果给出该选项,它将覆盖 encoding 选项。这使得可以使用单个选项字典来处理词法分析器和格式化程序,并且仍然具有不同的输入和输出编码。