PowerShellのExport-Csvで書き出したCSVファイルを、そのままExcelで開くと日本語が文字化けする——これはとてもよくあるトラブルです。さらにWindows PowerShell 5.1では、何も指定しないと日本語が?に変わって消えてしまうという、もっと深刻な現象も起こります。原因は文字コード(エンコード)の指定にあります。
結論を先に言うと、Excelで正しく開けるCSVにするには、Export-Csvに-Encoding UTF8(BOM付きUTF-8)を付けるか、-Encoding Default(Shift-JIS)を付けます。この記事では、実機のWindows PowerShell 5.1で実際のファイルのバイトを確認しながら、CSVの文字化けを解決する方法を整理します。
- Windows PowerShell 5.1の
Export-Csvは、既定だと日本語が?に化けて失われます(ASCIIで書き出すため)。 - Excelで正しく開くには
Export-Csv -Encoding UTF8(BOM付きUTF-8)を使います。 - または
-Encoding Default(Shift-JIS)でも、ExcelはそのままCSVを正しく開けます。 - ExcelがUTF-8のCSVを認識するにはBOMが必要です。PowerShell 5.1の
UTF8はBOM付きなので好都合です。 - 読み込む
Import-Csvでも、ファイルに合った-Encodingを指定します。 - PowerShell 7では既定がBOMなしUTF-8に変わり、挙動が異なります。
文字コードやBOMの基礎は文字化けを直す方法(UTF-8・BOM・$OutputEncoding)、CSVデータの絞り込みはWhere-Object・Select-Object、ファイルの扱いはファイル・フォルダ操作もあわせて参考になります。
なぜ文字化けするのか(エンコードの不一致)
文字化けの原因は、CSVを保存したときの文字コードと、Excelが読もうとする文字コードが食い違うことです。Excelは、CSVを開くとき次のように判断します。
- UTF-8でBOMが付いている → UTF-8として正しく読む(文字化けしない)
- UTF-8だがBOMが無い → Shift-JISと勘違いして読み、日本語が文字化けする
- Shift-JIS → そのまま正しく読む(日本語環境のExcelの既定)
つまり、ExcelにUTF-8のCSVを正しく読ませるにはBOM(Byte Order Mark)という目印が必要です。PowerShellでこのBOMが付くかどうかが、文字化けするかしないかの分かれ目になります。
【最悪】既定のExport-Csvは日本語が消える(PS5.1)
まず知っておきたいのが、Windows PowerShell 5.1で-Encodingを指定せずにExport-Csvすると、文字化けどころか日本語そのものが失われることです。既定のエンコードがASCIIのため、日本語が?に置き換わってしまいます。
$data = [PSCustomObject]@{ 名前 = "山田太郎"; 部署 = "営業部" }
# NG: -Encoding を指定しない(PS5.1 の既定は ASCII)
$data | Export-Csv "C:\temp\out.csv" -NoTypeInformation
# → ファイルの中身: "??","??" のように日本語が ? に化けて失われる
# これは文字化けではなく「データの消失」。元に戻せない
実機で確認したところ、Windows PowerShell 5.1で-EncodingなしにExport-Csvすると、山田太郎が??に化けてファイルに保存され、元の文字列が完全に失われました(保存後のファイルから山田太郎を探しても見つかりません)。これは「Excelで見ると化ける」レベルの話ではなく、ファイル自体に正しいデータが残らないデータ消失です。一度?になった文字は二度と復元できません。日本語を含むCSVをExport-Csvするときは、必ず-Encodingを指定する——これが何よりも重要なポイントです。
解決1:-Encoding UTF8(BOM付き)でExcel対応
もっとも確実な解決策が-Encoding UTF8です。Windows PowerShell 5.1のUTF8はBOM付きで書き出すため、ExcelがUTF-8として正しく認識し、文字化けせずに開けます。
$data = [PSCustomObject]@{ 名前 = "山田太郎"; 部署 = "営業部" }
# OK: -Encoding UTF8(PS5.1 では BOM 付きで書き出される)
$data | Export-Csv "C:\temp\out.csv" -NoTypeInformation -Encoding UTF8
# → 先頭に UTF-8 BOM が付くので、Excel で開いても文字化けしない
# 日本語もそのまま保存される
実機でファイルのバイトを確認したところ、-Encoding UTF8で書き出したCSVは、先頭にUTF-8 BOM(EF BB BF)が付いていました。このBOMがあることで、ExcelはCSVをUTF-8として正しく認識し、日本語が文字化けしません。さらに、Export-Csv -Encoding UTF8で保存したCSVをImport-Csvで読み戻すと、山田太郎が元どおり取得できることも確認しました(ラウンドトリップが一致)。Windows PowerShell 5.1では、日本語CSVをExcelで使うなら-Encoding UTF8が第一候補です。BOM付きという、ここでは都合のよい仕様になっています。
解決2:-Encoding Default(Shift-JIS)
もう1つの方法が-Encoding Defaultです。日本語版WindowsではDefaultがShift-JIS(cp932)を意味します。Excelは日本語環境ではShift-JISのCSVをそのまま正しく開けるため、これも有効です。
$data = [PSCustomObject]@{ 名前 = "山田太郎"; 部署 = "営業部" }
# Shift-JIS(日本語 Windows の Default)で保存
$data | Export-Csv "C:\temp\out.csv" -NoTypeInformation -Encoding Default
# → Shift-JIS で書き出される。日本語環境の Excel はそのまま開ける
# (BOM は付かないが、Shift-JIS なので Excel が正しく判定する)
実機でも、-Encoding Defaultで保存したCSVはShift-JISで書き出され、Shift-JISとしてデコードすると山田太郎が正しく読めることを確認しました。UTF8(BOM付き)とDefault(Shift-JIS)は、どちらもExcelで文字化けせずに開けます。社内システムがShift-JISのCSVを前提にしている場合はDefault、UTF-8で統一したい場合はUTF8、と使い分けるとよいでしょう。なお-Encoding UnicodeはUTF-16(BOM付き)で書き出され、これもExcelは開けますが、ファイルサイズが大きくなります。
読み込み側 Import-Csvのエンコード
CSVを読み込むImport-Csvでも、ファイルのエンコードに合わせて-Encodingを指定します。指定が合っていないと、読み込んだ時点で文字化けします。
# UTF-8(BOM付き)のCSVを読む
$data = Import-Csv "C:\temp\out.csv" -Encoding UTF8
# Shift-JIS のCSVを読む
$data = Import-Csv "C:\temp\sjis.csv" -Encoding Default
# 読み込んだデータは列名でアクセスできる
$data | ForEach-Object { $_.名前 }
BOM付きUTF-8のファイルなら、Import-CsvはBOMを見て自動的にUTF-8と判断することが多いですが、確実を期すなら-Encodingを明示するのが安全です。Shift-JISのファイルを-Encoding UTF8で読んだり、その逆をしたりすると文字化けするので、書き出したときと同じエンコードで読むことを意識してください。読み込んだあとは、$_.名前のように列名でアクセス・絞り込みができます。
PowerShell 7では既定が違う
注意点として、PowerShell 7(PowerShell Core)では既定のエンコードが変わっています。PowerShell 7のExport-Csvの既定はBOMなしのUTF-8です。日本語は失われませんが、BOMが無いためExcelで開くと文字化けすることがあります。
# PowerShell 7 の既定は BOM なし UTF-8 # → 日本語は消えないが、BOM が無いので Excel で文字化けすることがある # PowerShell 7 で Excel 向けにするなら、BOM 付き UTF-8 を明示する $data | Export-Csv "C:\temp\out.csv" -NoTypeInformation -Encoding utf8BOM # Shift-JIS にしたいときは、まず System.Text.Encoding の登録が必要な場合がある
バージョンによって既定が違うため、環境に関わらず-Encodingを明示するのが最も安全です。Windows PowerShell 5.1ならUTF8でBOM付き、PowerShell 7でExcel向けにするならutf8BOMを指定します。「自分のスクリプトがどのバージョンで動くか」を意識して、エンコードを明示しておきましょう。
エンコード早見表
Windows PowerShell 5.1のExport-Csv -Encodingと、Excelでの結果をまとめます。
| -Encoding | 書き出される形式 | Excelで開くと |
|---|---|---|
| (指定なし) | ASCII | 日本語が消える(最悪) |
UTF8 |
UTF-8(BOM付き) | 正しく開ける(おすすめ) |
Default |
Shift-JIS | 正しく開ける |
Unicode |
UTF-16(BOM付き) | 開けるがサイズ大 |
よくある失敗
-Encodingを指定せずExport-Csvする
PS5.1の既定はASCIIで、日本語が?に消えます。必ず-Encoding UTF8などを指定します。
BOMなしUTF-8でExcelに渡す
ExcelはBOMなしUTF-8をShift-JISと誤読し文字化けします。UTF8(PS5.1ならBOM付き)にします。
書き出しと読み込みでエンコードが違う
保存時とImport-Csvの-Encodingをそろえます。違うと読み込みで化けます。
PowerShellのバージョンを意識しない
5.1と7で既定が違います。-Encodingを明示すれば、どちらでも安定します。
一度?になったファイルを直そうとする
?になった時点でデータは失われ復元できません。保存し直しが必要です。
よくある質問
Export-Csv -Encoding UTF8(BOM付きUTF-8)にすると、Excelで文字化けせずに開けます。Shift-JISでよければ-Encoding Defaultでも開けます。-Encodingを指定せずにExport-Csvすると、既定のASCIIで書き出されて日本語が?に変わり、データが失われます。これは復元できないため、-Encoding UTF8を付けて保存し直してください。日本語CSVでは-Encodingの指定が必須です。-Encoding UTF8はBOM付きなので問題ありませんが、PowerShell 7では既定がBOMなしUTF-8のため、-Encoding utf8BOMを指定してください。-Encoding UTF8(BOM付き)、社内システムや既存の処理がShift-JIS前提なら-Encoding Defaultが無難です。どちらもExcelで正しく開けます。受け渡し先の都合に合わせて選んでください。Import-Csv -Encodingを指定してください。UTF-8のファイルならUTF8、Shift-JISならDefaultです。書き出したときと違うエンコードで読むと文字化けします。まとめ
- Windows PowerShell 5.1の
Export-Csvは既定だと日本語が?に消えます。必ず-Encodingを指定します。 - Excel向けには
-Encoding UTF8(BOM付きUTF-8)が第一候補です。 -Encoding Default(Shift-JIS)でもExcelで正しく開けます。- ExcelがUTF-8を認識するにはBOMが必要。PS5.1の
UTF8はBOM付きです。 - PowerShell 7は既定がBOMなしUTF-8なので、Excel向けは
utf8BOMを指定します。
CSVの文字化けは、「保存時に-Encodingを明示する」だけでほぼ解決します。とくにWindows PowerShell 5.1では、既定のままだと日本語が失われるという落とし穴があるため、-Encoding UTF8を習慣づけてください。これだけで、PowerShellで作ったCSVを安心してExcelに渡せるようになります。

