Unicode和编码

由于Pygments 0.6,所有lexer都在内部使用unicode字符串。因为你可能会偶尔遇到 UnicodeDecodeError 如果传递的字符串编码错误。

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

  • UTF-8(包括物料清单处理)

  • 区域设置编码(即“locale.getPreferredEncoding()”的结果)

  • 作为最后手段,拉丁语`

如果向lexer传递字节字符串对象(不是unicode),它将尝试使用此编码对数据进行解码。

您可以使用 encoding or inencoding lexer options. If you have the 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 ),编码处理方式不同,请参阅 the command line docs .

在 0.7 版本加入: 格式化程序现在还接受 outencoding 选项将覆盖 encoding 如果给出选项。这使得在lexer和格式化程序中使用单个选项dict成为可能,并且仍然有不同的输入和输出编码。