LoginSignup
0
1

More than 3 years have passed since last update.

python 3.8.0~2をwindowsから利用する人がマルチバイト文字を扱うための本当の方法

Posted at

最初に結論

  • python -X utf8で起動せよ
  • それでもだめなら環境変数の設定を行い、変数名PYTHONIOENCODING、値utf-8に設定します。

初めに

「この記事はpython3.8.0~python3.8.2をwindowsから利用する人向けに書いています。
python3.7以前やpython3.8.2よりも新しいバージョンについては知りません。」
敢えてこう宣言しておきます。

あなたはきっとこの記事にたどり着くまでの間、

  1. 例えばhttp.serverか何かを動かそうとして
  2. UnicodeDecodeErrorにいじめられて
  3. sys.stdout = io.TextIOWrapper( sys.stdout.buffer, encoding=’utf-8’ )を実行し、
  4. bufferという属性は(sys.stdoutには)存在しません」とコンパイラに叱られて、
  5. 次の情報を探してくるもなかなか見つからなかった

のではないでしょうか。
どうやら、
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に設定します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1