4

Windows上のPythonで下記のコードを実行するとエラーになります。
なぜでしょうか?

import datetime
d = datetime.datetime.now()
d.strftime("%y年")

cmd.exeでreplを起動して実行したところ、このエラーが発生しました。

UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: Illegal byte sequence

Windows 10 1803
Python 3.6.5

KiYugadgeter
  • 4,358
  • 6
  • 60
  • 110

2 Answers2

3

公式ドキュメントのstrftime() と strptime() の振る舞いによると、PythonはCライブラリのstrftime()関数を呼び出しています。
この呼び出しが原因で、Windows10では下記引用のUnicodeEncodeErrorになります。

On some platforms such code points are preserved intact in the output, while on others strftime may raise UnicodeError or return an empty string instead.

本家SOの類似質問と、 @Kohei TAMURA さんのご回答にあるブログの内容を参考に対応方法を列挙します。

formatで回避する

d.strftime('%Y{0}%m{1}%d{2}').format(*'年月日')

localeを設定する

import locale
locale.setlocale(locale.LC_ALL, '')
# Shift-JIS範囲内のコードのみ使用可能
d.strftime('%Y年%m月%d日')

エンコードしてデコードする

d.strftime('%Y年%m月%d日'.encode('unicode-escape').decode()).encode().decode("unicode-escape")

strftimeを自作する

リンク先を参照してください。

payaneco
  • 12,323
  • 21
  • 57
0

同じエラーについて話題にしているブログがありました。未解決のバグかもしれませんね。

http://d.hatena.ne.jp/itasuke/20141103/p1

Kohei TAMURA
  • 5,187
  • 2
  • 11
  • 23