最近は客先のWindowsで作業する事がおおくなりました。
PowerShellがソコソコ使えるので何とかなってますが、時折妙なクセがあったりしますね。
今回はそんな変なクセの一つ、Pythonの標準文字コードがなぜかSJISになってることと、その対処について。
実際のところ
PowerShell上のPythonで16進数を送ろうとしたところ、こんなエラーが。
> python3 -c "print('\x80\x00\x02\xfb...\x00\x02')" | yourprocess Traceback (most recent call last): File "<string>", line 1, in <module> UnicodeEncodeError: 'cp932' codec can't encode character '\xfb' in position 7: illegal multibyte sequence
cp932……ようはM$様のオレオレSJISにそんなコードはないというているのですが、こちらだってオマエなど指定した覚えはないんですよ。
Pythonのデフォがcp932になっているせいなので、お利口さんなら環境変数を直すところでしょう。
ただ、私は経験上Windowsの環境変数を弄って幸せになれた試しがないので、ここはオプションでかわそうとおもいます。
ここで活躍するのが"-X" utf8"オプション。
ヘルプによると、
-X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
otherwise activate automatically)
とあり、OSの設定を上書きしてUTF-8で書いてくれるすぐれもの。
実際にワンライナーでやるとこんな感じ。
> python3 -X utf8 -c "print('\x80\x00\x02\xfb...\x00\x02')" | yourprocess