先日、ちょっとした作業をPowerShellでスクリプト化する仕事をしました。
いつもの調子でUTF-8(BOMなし)で書いてチームメンバーに共有したところ、相手の環境では文字化けが発生してしまってまともに動かない状態に。文字化けの状況からSJISで保存すれば動きそうだなと判断して、SJISで保存し直してもらってスクリプト自体は無事に動いたのですが、手元ではUTF-8で動いているし、なんだか納得いかないので調べてみることにしました。
結論としては、古いPowerShell(powershell.exe)と新しいPowerShell(pwsh.exe)で文字の扱いが違う事によるのが今回の件の原因だったのですが、後学のために少しまとめておきます。
PowerShellにはマジックコメントの類は無い
マジックコメントとは、こういうやつで、スクリプトファイル自体の文字コードを処理系やエディタに伝える役割を果たすコメントの事です。
# -*- coding: utf-8 -*-
PowerShellにはこの類の機能は無く、また文字コードについて探してみても、スクリプトファイル自体の文字コードの扱いに関する情報はあまり出てきません。(多くがファイルから入力する際のエンコーディングの議論になっているようです)
BOM付UTF-8か、SJISで書いておくのが無難
「無難」という意味では、BOM付のUTF-8かSJISで書いておくのが良さそうです。(参考)
BOMがあれば文字コードの自動判別を行ってくれるようなので、そのほかの選択肢もありそうですが、チーム内でスクリプトを共有するとなると(GitHub的な)中央集権型の管理が行われるでしょうから、そこで問題になりづらいエンコードを選択しておくのが良さそうです。
設定変数を介して制御する方法もある
$PSDefaultEncoding変数であったり、$OutputEncoding変数であったりを介して出力する文字列のエンコーディングを制御する事で、文字化けによるスクリプトのクラッシュを防ぐ方法もあるようです。
どの方法が良いかは、環境次第という感じですが、powershell.exeとpwsh.exeの両方で動かす必要のあるスクリプトについては、私はしばらく無難な方法を選択していこうかなと思っています。