【PowerShell】CSVをExcelで開くと文字化けする問題の解決|Export-CsvとUTF-8 BOM

【PowerShell】CSVをExcelで開くと文字化けする問題の解決|Export-CsvとUTF-8 BOM PowerShell

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 UTF8BOM付きUTF-8)を使います。
  • または-Encoding DefaultShift-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のため、日本語が?に置き換わってしまいます。

既定はデータが壊れる(PS5.1)
$data = [PSCustomObject]@{ 名前 = "山田太郎"; 部署 = "営業部" }

# NG: -Encoding を指定しない(PS5.1 の既定は ASCII)
$data | Export-Csv "C:\temp\out.csv" -NoTypeInformation

# → ファイルの中身: "??","??" のように日本語が ? に化けて失われる
#    これは文字化けではなく「データの消失」。元に戻せない
既定のExport-Csvは日本語を破壊する(PS5.1)

実機で確認したところ、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として正しく認識し、文字化けせずに開けます。

UTF8(BOM付き)で保存
$data = [PSCustomObject]@{ 名前 = "山田太郎"; 部署 = "営業部" }

# OK: -Encoding UTF8(PS5.1 では BOM 付きで書き出される)
$data | Export-Csv "C:\temp\out.csv" -NoTypeInformation -Encoding UTF8

# → 先頭に UTF-8 BOM が付くので、Excel で開いても文字化けしない
#    日本語もそのまま保存される
PS5.1のUTF8は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ではDefaultShift-JIS(cp932)を意味します。Excelは日本語環境ではShift-JISのCSVをそのまま正しく開けるため、これも有効です。

Default(Shift-JIS)で保存
$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を指定します。指定が合っていないと、読み込んだ時点で文字化けします。

Import-Csv の読み込み
# 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 での注意
# 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を明示すれば、どちらでも安定します。

一度?になったファイルを直そうとする

?になった時点でデータは失われ復元できません。保存し直しが必要です。

よくある質問

QExport-CsvしたCSVをExcelで開くと文字化けします。
A保存時のエンコード指定が原因です。Windows PowerShell 5.1ならExport-Csv -Encoding UTF8(BOM付きUTF-8)にすると、Excelで文字化けせずに開けます。Shift-JISでよければ-Encoding Defaultでも開けます。
QCSVの日本語が「?」になってしまいました。
AWindows PowerShell 5.1で-Encodingを指定せずにExport-Csvすると、既定のASCIIで書き出されて日本語が?に変わり、データが失われます。これは復元できないため、-Encoding UTF8を付けて保存し直してください。日本語CSVでは-Encodingの指定が必須です。
QUTF-8で保存したのにExcelで化けます。
ABOMが無いUTF-8だと、ExcelがShift-JISと誤認して文字化けします。Windows PowerShell 5.1の-Encoding UTF8はBOM付きなので問題ありませんが、PowerShell 7では既定がBOMなしUTF-8のため、-Encoding utf8BOMを指定してください。
QUTF-8とShift-JISのどちらで保存すべきですか?
AUTF-8で統一したいなら-Encoding UTF8(BOM付き)、社内システムや既存の処理がShift-JIS前提なら-Encoding Defaultが無難です。どちらもExcelで正しく開けます。受け渡し先の都合に合わせて選んでください。
QImport-Csvでも文字化けします。
A読み込むファイルのエンコードに合わせて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に渡せるようになります。