WindowsでPythonプログラムへ日本語の引数を引き渡すときの文字化けと対策


文字化けの問題

久しぶりWindowsでPythonスクリプトを書くことになりました。セキュリティーの規制でコマンドプロンプトが使えなく、Pythonスクリプトを起動するにはWindowsバッチを使う必要があります。パラメーターとして日本語の文字列を渡すのですが、Pythonプログラム内では(sys.argvの中身)文字化けになってしまう事象でした。

%echo off
C:\python.exe hogehoge.py "あいうえお"
set /p confirm="Enter."

Pythonプログラムで標準出力に書く。

# -*- encoding: utf-8 -*-
import sys

def main():
    if len(sys.argv) > 1:
        print(sys.argv[1])

if __name__ == '__main__':
    main()

結果はこうなっています。

解決方法

色々検索して、文字列(sys.argv)をencodeしたり、decodeしてみたりしたのですが、効果がなくまたはエラーになりました。

バッチファイルのエンコードとPythonスクリプトのエンコードの両方は UTF-8になっていて、なんで引き渡した後文字化けになっているか原因特定できていないのですが、恐らく文字列を引き渡すときに、エンコードに使っているエンコーディングはUTF-8でないのは確実かと思われます。それで、以下のようにバッチを修正して、コマンドプロンプトの環境のエンコーディング(Windowsではアクティブページ)をUTF-8にすると、うまく文字化けを解決しました。

%echo off
chcp 65001
C:\python.exe hogehoge.py "あいうえお"
set /p confirm="Enter."

以上になります。同じ問題にあった人に役に立てばと幸いです。