time.strftime で UnicodeEncodeError が出るんだが

WindowsのPython3で、time.strftimeに日本語を渡すと例外が出る。

>>> import time
>>> time.strftime("%Y年%m月%d日")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: Illegal byte sequence

事前にlocale.setlocaleを呼んでおけば*1Shift_JISの範囲内であれば通るようになるが、

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'Japanese_Japan.932'

>>> time.strftime("%Y年%m月%d日")
'2014年11月03日'

他の文字はやっぱり通らない。

>>> time.strftime('\N{LATIN SMALL LETTER A WITH MACRON} %Y年%m月%d日')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    time.strftime('\N{LATIN SMALL LETTER A WITH MACRON} %Y年%m月%d日')
UnicodeEncodeError: 'locale' codec can't encode character '\u0101' in position 0: Illegal byte sequence


ソースコードを調べてみるとCランタイムのstrftimeを使っていた。このせいで wchar_t* → char* 変換していて、おそらくこの辺りで失敗していると思われるが、具体的な場所がわからない。

そもそもPython3から文字列はUnicodeで統一されているので内部で不用意にマルチバイトに変換してはならないと思うのだが。調べてる途中に見つけたバグ報告ページによれば、どうもwhcar_t版であるwcsftimeではタイムゾーン文字列を正しく扱えないので、仕方なくstrftimeを使っているとのこと。

ま、そのうち直ると思うけど、既に報告から4年以上経ってるからな。いつになることやら。

*1:IDLEなどのIDEを使っている場合は、起動時に自動でsetlocaleされてることもあるよ。