#最初に結論
-
python -X utf8
で起動せよ - それでもだめなら環境変数の設定を行い、変数名
PYTHONIOENCODING
、値utf-8
に設定します。
#初めに
「この記事はpython3.8.0~python3.8.2をwindowsから利用する人向けに書いています。
python3.7以前やpython3.8.2よりも新しいバージョンについては知りません。」
敢えてこう宣言しておきます。
あなたはきっとこの記事にたどり着くまでの間、
- 例えば
http.server
か何かを動かそうとして -
UnicodeDecodeError
にいじめられて -
sys.stdout = io.TextIOWrapper( sys.stdout.buffer, encoding=’utf-8’ )
を実行し、 - 「
buffer
という属性は(sys.stdout
には)存在しません」とコンパイラに叱られて、 - 次の情報を探してくるもなかなか見つからなかった
のではないでしょうか。
どうやら、
sys.stdout.buffer
は3.8から廃止された(?)ようです。
その証拠に、
この方法でうまくいった人にバージョンを聞くと3.7以前、失敗した人たちにバージョンを聞くと3.8と答えるのです。(ちゃんと調査していないので偶然かもしれません。そうだったらすみません)
3.8よりも古い情報が「3.x向け」とか「3向け」と謡っているせいでややこしいのです。
3.6や3.7が最新だった当時、3.8で仕様が変わるとは考えもしなかったため、一般化してしまったといったところでしょう。
これからは「python3向け」などといわず、「python3.0~3.7向け」のような言い方をしてほしいものですよね。
#なぜエラーになるのか
https://qiita.com/butada/items/33db39ced989c2ebf644 によれば、windows10やそれ以前では標準出力がshift_jisで成り立っているんだそう。
そのせいでpython3.8.2やそれ以前をwindowsで動かすと、python内部での文字コードが何であろうと、出力の際にshift_jisに自動で変換してしまうんだとか。この過程でエラーが起こります。
(ちなみにpython3~3.8.2では、str型の文字コードはutf-8に固定されています。
また一部に「# coding: utf-8
」を提案している掲示板もありましたが、これはソースのエンコーディングの指定です)
#解決策
python3.7~3.8.2では、python
をコンソールから起動するとき-X utf8
のオプションを追加することで「UTF-8 モード」で起動できます。
こちらでは「shift_jisに自動で変換」といった真似はやめてくれます。
・ちなみにhttp.serverを利用したい方は、これだけでは足りないようです。
環境変数の設定を行い、変数名PYTHONIOENCODING
、値utf-8
に設定します。