質問: ### 前提・実現したいこと 最近、プログラミングを始めてみようと思いPythonをhttps://www.python.org/からDLしました。 試しに以下のよいなコードでテキストファイルを作成し、Git-bashでコンパイルしたところ日本語の部分が文字化けしてしまいました。このときbashのtextの設定はフォントをMSゴシック、文字サイズ8pt,Localeをja_JP、Character set UTF-8に設定していました。またbash上では日本語を打つことも可能でした。どこの設定を直したら文字化けが直るでしょうか。 OSはWindows10です。 回答よろしくお願いします。 ### 発生している問題・エラーメッセージ ``` Hello world Bye ▒▒▒▒ɂ▒▒▒ ``` ### 該当のソースコード ``` # coding: UTF-8 print("Hello world") print("Bye") print("こんにちは") ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど)
回答: うまくいかない原因 ========= 先頭行にあるエンコード宣言(`# coding: UTF-8`)は「そのスクリプトファイルがどのようなエンコーディングで記述されているか」を指示するものなのですが、インタープリタが標準入出力として「どのエンコーディングを用いるか」を制御するものではありません。 またGit-Bashの端末設定でのロケールがらみの設定はあくまでUnixの流儀に従うコマンド群にのみ影響するものです。その流儀とはLANG等々の環境変数に応じて文字のエンコーディングが決まるというものです。Git-Bashで使えるls等のコマンドはこの流儀に従い動作しますが、質問者さんがインストールした「Windows用にビルドされたPython」はそうではありません。lsもpythonも元々Unix系OSで開発されたコマンドだと思いますが、なぜlsがUnix流儀でpythonがそうでないかというと、lsがUnix likeなCUI環境を提供することを主眼に設計されたGit-Bash専用のコマンドとして移植されたものであり、Pythonの方はWindowsの標準的なCUI環境であるコマンドプロンプトやPowserShell上で自然に動作するように設計されているからだと思います。CUIといってもGit-Bash(が用いているMinGW環境)とコマンドプロンプトでは仕様の差異があるわけです。 対処 == Git-Bash上でpythonを動かす想定でもっとも手軽な方法は環境変数PYTHONIOENCODINGを設定することだと思います。 ``` $ locale LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_ALL= $ cat hello.py # coding: UTF-8 print("Hello world") print("Bye") print("こんにちは") $ type python python is hashed (/c/Program Files/Python37/python) $ python hello.py # 文字化けする例 Hello world Bye ▒▒▒▒ɂ▒▒▒ $ # 文字化けしない例 $ export PYTHONIOENCODING=utf8 # この環境変数を設定しておく $ python hello.py Hello world Bye こんにちは $ python hello.py Hello world Bye こんにちは $ unset PYTHONIOENCODING # 環境変数を消すと元のとおり文字化けする $ python hello.py Hello world Bye ▒▒▒▒ɂ▒▒▒ ``` 毎回この環境変数の設定をするのは面倒なのでGit-Bash起動時に自動的に設定するようにしておくのもよいでしょう。それをするにはホームディレクトリー(デフォルトではWindowsのホームディレクトリーになっていると思います)に`.profile`というログインスクリプトファイルを作成しそこに ``` export PYTHONIOENCODING=utf8 ``` の1行を書いておけばよいです。 Windowsで動作する色々なPython: 質問者さんがインストールしたのは「いわゆるWindows用の標準的なPython」でありコマンドプロンプトやPowserShell上で動かすときに最も自然と思われる動作をすると思います。実際、問題のプログラムをコマンドプロンプトから`python xxx.py`で動かしてみてください。文字化けせずに「こんにちは」と表示されると思います。 このPythonの実装はGit-BashやcygwinあるいはWindows Subsystem for Linux上でも「動くことは動く」のですがGit-BashやcygwinやWSL(上のUbuntu)で自然な動作となるような仕様にはなっていません。 Git-Bash、cygwin、WSLそれぞれ「その環境用のPythonのビルド」が存在します。そういったものをインストールして使うとそれぞれの環境で最も自然な仕様で動作する(例えば端末のロケール設定に従ってエンコーディングが決まってくれる)と思います。