目次
Windows環境のPowerShellでaws-cliを実行した場合、環境設定によっては結果表示が文字化けする事があります。
本記事ではどのような場合に文字化けが発生するのか、またどのようにすれば文字化けを回避できるのか確認してみます。
今回試している環境
- Windows 11 23H2
- PowerShell 7.5.0-preview.2
- aws-cli/2.17.65 Python/3.12.6 Windows/11 exe/AMD64
- システムロケールの設定:日本語 (日本)
文字化けするケースを確認してみる
システムロケールの設定が日本語 (日本)で、コードページの設定が65001としている場合、コンソール出力に日本語が含まれると文字化けする事を確認しています。
ここでは状況が再現するサンプルとして一例を紹介します。
まずはEC2インスタンスのタグに、下記のように日本語を含んだタグを用意します。
上記インスタンスのタグ情報を、システムロケールが日本語の状態かつchcp 65001でコードページをUTF-8に変更し、aws ec2 describe-instance でインスタンス情報を取得します。。
コマンドとしては下記# システムロケールを確認
Get-WinSystemLocale
# code pageを変更
chcp 65001
# タグに日本語を含んだインスタンスの情報を取得
aws ec2 describe-instances --instance-ids i-0ae061bc95d1e8b5c --output text --query "Reservations[*].Instances[*].Tags"
実行してみると画像のようにec2 describe-instancesコマンドの結果が文字化けしている事が確認できます。
タグキー:Nameの方は無事で、タグキー:foo-テスト-barの方は日本語部分が文字化けしている事がわかる。
回避策1 環境変数 $env:PYTHONUTF8=1 を設定する
The AWS CLI ignores attempts to use UTF-8 on Windows, #8312
aws-cliのissueに関連しそうな投稿が見つかりました。
この中で対応策としてはWindowsのシステムロケールを変更する方法と、環境変数を設定する方法が紹介されていました。
文字化けを直したいためだけに、システムロケールは少し大事なので、ここでは環境変数 PYTHONUTF8=1 を設定して文字化けを回避してみます。
# システムロケールを確認
Get-WinSystemLocale
# 先ほどコードページを65001にしているので確認のみ
chcp
# 環境変数を設定
$env:PYTHONUTF8=1
# タグに日本語を含んだインスタンスの情報を取得
aws ec2 describe-instances --instance-ids i-0ae061bc95d1e8b5c --output text --query "Reservations[*].Instances[*].Tags"
上記画像のように、環境変数を設定する事で ec2 describe-instancesの文字化けが解消される事がわかります。
環境変数 PYTHONUTF8について
1. コマンドラインと環境 — Python 3.12.7 ドキュメント
ドキュメントを確認してみると環境変数PYTHONUTF8 はロケールのエンコーディングを無視して、UTF-8の仕様を強制するフラグのようです。
これを設定する事でロケールが日本語 (日本)の環境でもUTF-8が強制され、PowerShell側のOutputEncodingがUTF-8の場合に文字化けが解消される事となります。
なおPython 3.7から追加された環境変数のようなのでだいぶ古いaws-cliを利用している場合はこの方法で回避できないかも?
回避策2 chcp 932で実行
システムロケールが日本語 (日本)の状態だと、aws-cliに使われているpythonがシステムロケールの影響を受けてShift-JISで出力を行い、PowerShell側はコードページがUTF8になっている事が問題かと思います。
ためしにPowerShell側の設定をchcp 932でコードページをJapanese (Shift-JIS)に変更して実行すると文字化けは発生しません。
余談
PowerShell 7.4 と oh-my-posh(シェルプロンプトのカスタマイズツール)の組み合わせで利用する場合、プロンプト表示が壊れる事象があり、公式が回避策としてOutputEncodingをUTF8に変更する方法が紹介されています。
このためPowerShell 7.4 とoh-my-poshを利用している環境では、上記回避策を利用していると、システムロケールは日本語 (日本)でPowerShellのOutputEncodingがUTF8になってしまい、aws-cliを実行するときに思わむ文字化けが発生する環境になってしまいます。
総評
今回の文字化けについて、aws-cliはシステムが提供しているエンコーディングに影響を受けており、aws-cliの出力結果と、PowerShellでのエンコーディングの取り扱いで差がでると文字化けする事がわかりました。
何かしらの理由でシステムロケールは日本語 (日本)に設定しているが、PowerShellコンソール上の設定ではUTF-8を利用している、なんて人は環境変数を設定して回避するのが簡単でよさそうに思います。
- カテゴリー