このPython 3.2コードがなぜ
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e)))
問題なく動作します(WindowsシェルのUnicodeエンコードを除く)が、これは
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e, encoding = 'utf-8')))
投げるTypeError: str への強制: バイト、バイト配列、またはバッファのようなオブジェクトが必要です。例外が見つかりました?
エラーをカスタムエンコーディングの文字列に変換するにはどうすればいいですか?
編集
メッセージに \u2019 がある場合も機能しません。
try:
raise Exception(msg)
except Exception as e:
b = bytes(str(e), encoding = 'utf-8')
print("Error {0}".format(str(b, encoding = 'utf-8')))
しかし、なぜ str() は例外を内部的にバイトに変換できないのでしょうか?
ベストアンサー1
Python 3.x では、Unicode 文字が含まれている場合でも、str(e)
任意の文字を文字列に変換できるはずです。Exception
したがって、例外がカスタム__str__()
メソッドで実際に UTF-8 でエンコードされたバイト配列を返さない限り、str(e, 'utf-8')
期待どおりに動作しません (RAM 内の 16 ビット Unicode 文字列を UTF-8 でエンコードされたバイト配列として解釈しようとします...)
私の推測では、問題は(つまり、Python Unicode 文字列をコンソールにダンプされるものに変換するステップ)str()
ではないと思います。解決策については、この回答を参照してください。print()
Python、Unicode、Windows コンソール