うまくいかない原因
先頭行にあるエンコード宣言(# 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を設定することだと思います。
bash
1$ locale
2LANG=ja_JP.UTF-8
3LC_CTYPE="ja_JP.UTF-8"
4LC_NUMERIC="ja_JP.UTF-8"
5LC_TIME="ja_JP.UTF-8"
6LC_COLLATE="ja_JP.UTF-8"
7LC_MONETARY="ja_JP.UTF-8"
8LC_MESSAGES="ja_JP.UTF-8"
9LC_ALL=
10
11$ cat hello.py
12# coding: UTF-8
13print("Hello world")
14print("Bye")
15print("こんにちは")
16
17$ type python
18python is hashed (/c/Program Files/Python37/python)
19
20$ python hello.py # 文字化けする例
21Hello world
22Bye
23▒▒▒▒ɂ▒▒▒
24
25$ # 文字化けしない例
26$ export PYTHONIOENCODING=utf8 # この環境変数を設定しておく
27
28$ python hello.py
29Hello world
30Bye
31こんにちは
32
33$ python hello.py
34Hello world
35Bye
36こんにちは
37
38$ unset PYTHONIOENCODING # 環境変数を消すと元のとおり文字化けする
39
40$ python hello.py
41Hello world
42Bye
43▒▒▒▒ɂ▒▒▒
毎回この環境変数の設定をするのは面倒なのでGit-Bash起動時に自動的に設定するようにしておくのもよいでしょう。それをするにはホームディレクトリー(デフォルトではWindowsのホームディレクトリーになっていると思います)に.profile
というログインスクリプトファイルを作成しそこに
bash
1export 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のビルド」が存在します。そういったものをインストールして使うとそれぞれの環境で最も自然な仕様で動作する(例えば端末のロケール設定に従ってエンコーディングが決まってくれる)と思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/12 00:47
2019/04/12 17:09