52063


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

[code]

    import datetime
    d = datetime.datetime.now()
    d.strftime("%y年")
    
[/code]

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

[code]

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

Windows 10 1803  
Python 3.6.5


CC BY-SA 4.0
2018-06-07T13:17:37.740
44597
2019-01-18T00:47:49.083
5246
question
python windows python3
Windows上のPythonのdatetime.strftimeで日本語を使うとエラーになる?


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

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


CC BY-SA 4.0
2018-06-07T13:22:51.360
44599
2018-06-07T13:22:51.360
21092
44597
answer


公式ドキュメントの[strftime() と strptime()
の振る舞い](https://docs.python.org/ja/3/library/datetime.html#strftime-strptime-
behavior)によると、PythonはCライブラリの`strftime()`関数を呼び出しています。  
この呼び出しが原因で、Windows10では下記引用のUnicodeEncodeErrorになります。

> On some platforms such code points are preserved intact in the output, while
> on others strftime may raise
> [UnicodeError](https://docs.python.org/ja/3/library/exceptions.html#UnicodeError)
> or return an empty string instead.

本家SOの[類似質問](https://stackoverflow.com/q/16034060)と、 @Kohei TAMURA
さんのご回答にある[ブログ](http://d.hatena.ne.jp/itasuke/20141103/p1)の内容を参考に対応方法を列挙します。

**[formatで回避する](https://stackoverflow.com/a/16035152)**

[code]

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

**[localeを設定する](http://d.hatena.ne.jp/itasuke/20141103/p1)**

[code]

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

**[エンコードしてデコードする](https://stackoverflow.com/a/49791321)**

[code]

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

**[strftimeを自作する](https://stackoverflow.com/a/16036865)**

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


CC BY-SA 4.0
2019-01-18T00:47:49.083
52063
2019-01-18T00:47:49.083
9820
44597
answer