UnicodeEncodeErrorが発生した際の挙動を変更したかったので、備忘録。

Pythonでは、以下のような UnicodeEncodeError に出くわすことがよくあります。

よくあるUnicodeEncodeError

v = u"\u2013"

print(v.encode("utf-8"))   # OK
print(v.encode("cp932"))   # NG
$ python tmp.py            
–
Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    print(v.encode("cp932"))   # NG
UnicodeEncodeError: 'cp932' codec can't encode character u'\u2013' in position 0: illegal multibyte sequence

挙動を変えてみる

str.encode()の引数を変更することで、挙動を変えることができます(参考)。
(デフォルトでは、先の通りエラーになります)

標準とは異なるエラー処理を行うために errors を与えることができます。標準のエラー処理は ‘strict’ で、エンコードに関するエラーは UnicodeError を送出します。他に利用できる値は ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ および関数 codecs.register_error() によって登録された名前です。

例えば、replaceを選択すると、 ? で置き換えることができます。

v = u"\u2013"

print(v.encode("utf-8"))   # OK
print(v.encode("cp932", errors="replace"))   # OK
$ python tmp.py
–
?

とりあえず出力させたいだけであれば、replaceを選択するのも可?