ファイルの文字コード変換は、システム開発やデータ処理を行う際によく直面する課題です。特に 「UTF-8(BOMあり/なし)をShift_JIS(CP932)に変換したい」 というニーズは、Windows環境やツール利用、テストなどで頻繁に発生します。
本記事では、PowerShellを使って簡単かつ効率的に一括変換する方法を解説します。
UTF-8とShift_JIS(CP932)の違いとは
BOMあり/なしの違い
- BOMありUTF-8:ファイル先頭に「EF BB BF」という識別子が付く
- BOMなしUTF-8:識別子なし。Linux環境や一部のアプリケーションで好まれる
- 同じUTF-8でもBOMの有無によって、システムによっては正しく認識されないことがあります
Shift_JIS(CP932)の特徴
- 日本語Windowsで標準的に使われる文字コード
- 「CP932」としても呼ばれ、Microsoft独自の拡張が含まれている
- 古い業務システムやExcelなどでよく利用される
PowerShellで文字コード変換するメリット
- Windows標準で利用可能(追加インストール不要)
- フォルダ内の複数ファイルをまとめて処理できる
- スクリプト化することで再利用や自動化が容易
つまり、日常業務の効率化やヒューマンエラー防止につながります。
実践!PowerShellでUTF-8 → Shift_JIS一括変換
サンプルコードの機能説明
変換元フォルダに存在するすべてのCSVファイルの文字コードをUTF-8(BOMあり/なし))からShift_JIS(CP932)に変換します。
サンプルコード(コメント付き)
# UTF-8(BOMあり/なし)→ Shift_JIS(CP932)に一括変換するスクリプト
$src = "C:\temp\1_before" # 変換元フォルダ(入力)を指定 要変更!
$dst = "C:\temp\2_after" # 変換先フォルダ(出力)を指定 要変更!
# 出力エンコーディングを Shift_JIS(CP932)に設定
$encTo = [System.Text.Encoding]::GetEncoding(932)
# 出力先フォルダを作成(既存でもOK・表示抑制)
New-Item -ItemType Directory -Path $dst -Force | Out-Null
# 入力配下のCSVをサブフォルダ含めて列挙し1件ずつ処理
Get-ChildItem $src -Filter *.csv -File -Recurse | ForEach-Object {
# 元の相対パス構造を保って出力先のフルパスを作成
$outPath = Join-Path $dst $_.FullName.Substring($src.Length).TrimStart('\')
# 出力先の親ディレクトリを必ず作成
New-Item -ItemType Directory -Path (Split-Path $outPath) -Force | Out-Null
# UTF-8 として読み込む(第3引数 $true で BOM 有無の自動検出を許可)
# 入力CSVをUTF-8で開く
$sr = New-Object System.IO.StreamReader($_.FullName, [System.Text.Encoding]::UTF8, $true)
try {
# ファイル全体を文字列として読み込む
$text = $sr.ReadToEnd()
# tryの成否に関わらず実行
} finally {
# StreamReaderをクローズ(ハンドル解放)
$sr.Close()
}
# 出力ファイルをSJISで開く(第2引数 $false は上書き)
$sw = New-Object System.IO.StreamWriter($outPath, $false, $encTo)
try {
# 文字列をSJISとして書き出し(SJISに無い文字は '?' になる場合あり)
$sw.Write($text)
} finally {
# StreamWriterをクローズ(フラッシュ完了)
$sw.Close()
}
# 変換した入出力のパスを表示して進捗を確認
Write-Host "Converted: $($_.FullName) -> $outPath"
}
実行方法
サンプルコードの3行目、4行目を変更。3行目に変換したいファイルを格納しているフォルダ、4行目に変換したファイルを格納したいフォルダを設定。
$src = "C:\temp\1_before" # 変換元フォルダ(入力)を指定 要変更!
$dst = "C:\temp\2_after" # 変換先フォルダ(出力)を指定 要変更!
サンプルコードを.ps1 拡張子で保存。(例:convert_csv_utf8_to_sjis.ps1)
タスクバーにて「Windows PowerShell」を検索し、「Windows PowerShell」をクリック。
保存した .ps1 があるフォルダへコマンドで移動。(コードは「C:\temp\」フォルダに保存している場合)
cd C:\temp\
Windows の初期設定では PowerShell のスクリプトの実行が実行ポリシーによって許可されていません。そのため、一時的にスクリプトを許可する必要があります。
コマンドで一時的に実行を許可。
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
コマンドでps1ファイルを実行。
.\convert_csv_utf8_to_sjis.ps1
実行画面イメージ
実行画面イメージはこちらです。
変換したファイルがメッセージとして出力されていますね!

つまずきやすいポイント
文字化け:元が本当にSJIS(CP932)か確認。絵文字や特殊記号はSJISに無いのでUTF-8のまま扱うのが安全です。
アクセス拒否:出力先に書き込み権限が無いと失敗。別フォルダにするか、PowerShellを管理者で起動。
スクリプトが実行できない:「STEP4 一時的に実行を許可」にて実行を許可していますが、正常に許可できていない場合は以下のようなエラーが表示されます。 PowerShell のスクリプトの実行ポリシーをご確認ください。

PowerShell のスクリプトの実行ポリシーの確認方法は以下のコマンドでできます。
PowerShell Get-ExecutionPolicy
代表的な実行結果と意味を下表にまとめたのでご参考にしてください。
値 | できること / ふるまい | 典型的な用途 |
---|---|---|
Restricted | スクリプト(.ps1)は実行不可。対話的なコマンド入力のみ可。 | Windows PowerShell 5.1 の初期状態 |
AllSigned | すべて署名必須(自分で書いたものも含む)。 | 署名運用が徹底された企業環境 |
RemoteSigned | ローカル作成はOK。インターネット由来(ダウンロード等)は信頼済み署名が必要。 | 推奨のバランス設定(PowerShell 7 の既定) |
Unrestricted | 基本 すべて実行可。インターネット由来は一度だけ警告。 | 開発端末でサクッと回したい時 |
Bypass | 制限も警告も一切なし。 | 自動化バッチ・CI など一時的用途 |
Undefined | そのスコープに未設定(※後述の -List で出る)。 | 設定が継承されている状態 |
実際の利用シーンと注意点
Excel CSV処理:UTF-8で文字化けするためShift_JISに変換する必要があるケース
注意点:
- Unicodeの一部文字(絵文字や特殊文字)はShift_JISで表現できないため文字化けの恐れあり
- 事前に対象文字を確認し、必要に応じて置換処理を追加する
まとめ
本記事では、PowerShellを使って UTF-8(BOMあり/なし)からShift_JIS(CP932)への一括変換 を解説しました。
- UTF-8とShift_JISの違いを理解する
- PowerShellで簡単に変換可能
- フォルダ単位の一括変換で業務効率UP
実務で頻出する「文字コード変換」の悩みを、PowerShellのスクリプトでスマートに解決しましょう。
コメント