Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

PowerShellのPython3で文字列をおくりたいけど文字コードがcp932になっていて面倒なとき

最近は客先の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