Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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