PowerShellを使用してテキストファイルを操作する際、避けては通れないのが「文字コード」の設定です。
日本語環境では、伝統的なShift-JIS(CP932)と、現代の標準であるUTF-8が混在しており、適切に指定しないと文字化けが発生してしまいます。
特に、Windows PowerShell 5.1と最新のPowerShell 7系では、デフォルトの文字コードが異なるため注意が必要です。
この記事では、PowerShellで文字コードを明示的に指定してファイルを読み書きする方法について、具体的なコード例を交えて詳しく解説します。
PowerShellにおける文字コードの基本知識
PowerShellでファイルを扱う前に、まずはバージョンごとのデフォルト挙動を理解しておくことが重要です。
古いWindows PowerShell(バージョン5.1以前)では、多くのコマンドレットで「ANSI(日本語環境ではShift-JIS)」や「UTF-16」が標準として使われていました。
一方で、最新のPowerShell 7(Core)以降では、BOMなしのUTF-8がデフォルトとなっています。
この仕様の差が原因で、同じスクリプトを実行しても環境によって文字化けが発生することがあります。
予期せぬトラブルを防ぐためには、常に-Encodingパラメータを使用して文字コードを明示的に指定する習慣をつけるのがベストです。
主要な文字コードの指定キーワード
PowerShellの-Encodingパラメータで指定できる主なキーワードは以下の通りです。
| 指定キーワード | 内容 |
|---|---|
default | システムの現在のANSIコードページ(日本語環境ではShift-JIS) |
utf8 | UTF-8文字コード(PS7ではBOMなし、PS5.1ではBOMあり) |
ascii | 7ビットASCII文字セット |
oem | システムの現在のOEMコードページ |
bigendianunicode | UTF-16(ビッグエンディアン) |
ファイルを読み込む(Get-Content)
ファイルの内容を読み取るには、Get-Contentコマンドレットを使用します。
文字コードを指定せずに読み込むと、ファイル内の日本語が正しく表示されない場合があります。
Shift-JISのファイルを読み込む
日本のビジネスシーンで古くから使われているShift-JIS(CP932)形式のファイルを読み込む例を紹介します。
-Encoding defaultまたは-Encoding oemを指定することで、日本語環境の標準コードで読み取ることが可能です。
# Shift-JISとしてファイルを読み込む
$content = Get-Content -Path "C:\temp\sjis_file.txt" -Encoding default
# 内容を表示
$content
こんにちは、これはShift-JISのファイルです。
UTF-8のファイルを読み込む
Web関連や最新のアプリケーションで一般的なUTF-8ファイルを読み込む場合は、-Encoding utf8を指定します。
# UTF-8としてファイルを読み込む
$utf8Content = Get-Content -Path "C:\temp\utf8_file.txt" -Encoding utf8
# 内容を表示
$utf8Content
これはUTF-8で保存されたテキストです。
ファイルを書き込む(Set-Content / Out-File)
ファイルへの書き込みには、主にSet-ContentやOut-File(またはリダイレクト演算子>)を使用します。
ここでも文字コードの指定が非常に重要になります。
UTF-8(BOMなし)で保存する
モダンな開発環境では、BOM(Byte Order Mark)のないUTF-8が推奨されます。
PowerShell 7であれば、デフォルトでBOMなしUTF-8になりますが、明示的に指定する場合は以下のように記述します。
# 保存するテキスト
$text = "UTF-8で保存する文字列です。"
# UTF-8でファイルに書き込む
Set-Content -Path "C:\temp\output_utf8.txt" -Value $text -Encoding utf8
Shift-JISで保存する
Excelでそのまま開きたいCSVファイルや、古い基幹システムと連携するファイルを作成する場合は、Shift-JISでの保存が必要になります。
その場合は、-Encoding defaultを使用するのが最も確実です。
# 保存するテキスト
$sjisText = "Excelで開くための日本語文字列"
# Shift-JISでファイルに書き込む
Set-Content -Path "C:\temp\output_sjis.txt" -Value $sjisText -Encoding default
CSVファイルの読み書き(Import-Csv / Export-Csv)
PowerShellが得意とするCSV操作においても、文字コードの指定は欠かせません。
特にExport-Csvで日本語を含むデータを出力する際、指定を忘れると「???」のように文字化けしてしまいます。
CSVの読み込み例
# Shift-JISのCSVファイルを読み込む
$data = Import-Csv -Path "C:\temp\data.csv" -Encoding default
# データの確認
$data | Format-Table
CSVの書き出し例
Export-Csvを使用する際は、-NoTypeInformationスイッチも併用して、1行目に型情報が出ないようにするのが一般的です。
# データをShift-JISのCSVとして保存
$users = @(
[PSCustomObject]@{Name="田中"; Age=30},
[PSCustomObject]@{Name="佐藤"; Age=25}
)
$users | Export-Csv -Path "C:\temp\users.csv" -Encoding default -NoTypeInformation
文字化けを防ぐためのテクニック
頻繁に文字コードを指定するのが面倒な場合、「$PSDefaultParameterValues」という自動変数を利用して、デフォルト値を上書きする方法があります。
これを使用すると、そのセッション内でのコマンドレットの挙動を統一できます。
# Set-ContentとOut-FileのデフォルトエンコーディングをUTF-8に固定する
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
$PSDefaultParameterValues['Set-Content:Encoding'] = 'utf8'
この設定をPowerShellのプロファイル($PROFILE)に記述しておけば、毎回指定する手間が省け、うっかりミスによる文字化けを劇的に減らすことができます。
ファイルの文字コードを判定する方法
既存のファイルの文字コードが不明な場合、PowerShell単体で厳密に判定するのは難しい側面があります。
しかし、簡易的にBOMの有無を確認したり、特定のバイト列を確認することで推測は可能です。
確実性を期すなら、外部のツールやライブラリを検討するか、VS Codeなどのエディタで確認するのが現実的です。
PowerShell 7における「utf8NoBOM」の扱い
PowerShell 7では、-Encoding utf8を指定するとBOMなしになります。
もし敢えてBOMありのUTF-8を出力したい場合は、-Encoding utf8BOMというパラメータが用意されています。
このように、バージョンによってキーワードの解釈が微妙に異なる点には常に留意してください。
まとめ
PowerShellでファイルを扱う際の文字コード指定は、日本語環境において最も重要なトピックの一つです。
Get-Content、Set-Content、Export-Csvなど、どのコマンドレットを使用する場合でも、「-Encoding」パラメータを常に意識することが大切です。
現代的な環境であればUTF-8を基本としつつ、Excelやレガシーシステムとの連携が必要な場面ではShift-JIS(default)を使い分けるようにしましょう。
この記事で紹介した手法を活用して、文字化けに悩まされない効率的なスクリプト作成を実現してください。
