Unicode 和编码¶
从 Pygments 0.6 开始,所有词法分析器在内部使用 unicode 字符串。因此,如果您传递了编码错误的字符串,您可能会偶尔遇到 UnicodeDecodeError
。
默认情况下,所有词法分析器的输入编码都设置为 guess。这意味着将尝试以下编码
UTF-8(包括 BOM 处理)
区域设置编码(即 locale.getpreferredencoding() 的结果)
最后,latin1
如果您向词法分析器传递字节字符串对象(而不是 unicode),它会尝试使用此编码解码数据。
您可以使用 encoding 或 inencoding 词法分析器选项覆盖编码。如果您安装了 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 选项。这使得可以使用单个选项字典来处理词法分析器和格式化程序,并且仍然具有不同的输入和输出编码。