Unicodeとエンコード¶
Pygments 0.6以降、すべてのレクサーは内部でunicode文字列を使用します。そのため、間違ったエンコードを持つ文字列を渡した場合、ときどきUnicodeDecodeError
に遭遇する可能性があります。
既定では、すべてのレクサーの入力エンコードは推測に設定されています。これは、以下のエンコードが試行されることを意味します。
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で追加:フォーマッタは現在、encodingオプションが指定されている場合にencodingオプションをオーバーライドするoutencodingオプションも受け付けます。これにより、レクサーとフォーマッタで単一のオプション辞書を使用し、それでも異なる入力エンコードと出力エンコードを使用できるようになります。