PowerShellでCSVを出力したら、日本語だけが別の文字に見える。同じコマンドでも、Windows PowerShell 5.1とPowerShell 7では、文字コードの既定の扱いが異なります。出力するときと読み込むときの両方で、文字コードの指定を確かめます。
特にUTF8という名前の指定がどのバージョンでも同じBOMの有無を表すとは限りません。BOMはファイルの先頭に置かれる符号で、文字コードを判別する手掛かりになります。受け取る側が何を期待するかに合わせて選びます。
バージョンを先に確認する
$PSVersionTable.PSVersionで実行中のバージョンを確認できます。Windows PowerShell 5.1ではUTF8がBOM付き、PowerShell 7のutf8はBOMなしのUTF-8です。7でBOM付きにする場合はutf8BOMを指定します。
次はどちらの環境でもBOM付きUTF-8で練習用CSVを作る例です。新しい一時フォルダーを使い、既存ファイルは上書きしません。
$practiceDir = Join-Path ([IO.Path]::GetTempPath()) ('csv-encoding-' + [guid]::NewGuid())
[IO.Directory]::CreateDirectory($practiceDir) | Out-Null
$csvFile = Join-Path $practiceDir 'practice.csv'
if ($PSVersionTable.PSVersion.Major -ge 6) {
$csvEncoding = 'utf8BOM'
} else {
$csvEncoding = 'UTF8'
}
$rows = @([pscustomobject]@{担当 = '北'; コード = '0012'})
$rows | Export-Csv -LiteralPath $csvFile -NoTypeInformation -Encoding $csvEncoding
$readBack = @(Import-Csv -LiteralPath $csvFile -Encoding UTF8)
$readBack[0].担当
$readBack[0].コード
$bytes = [IO.File]::ReadAllBytes($csvFile)
[BitConverter]::ToString($bytes[0..2])
期待する表示は「北」「0012」と、先頭のEF-BB-BFです。BOMのバイト列を確かめたことと、日本語・先頭ゼロを文字列として読み戻せたことを分けて見ます。CSVの保存場所は$csvFileで確認できます。
既定値に任せない理由
Windows PowerShellでは、コマンドによって既定の文字コードが異なります。出力の方法をExport-CsvからOut-Fileやリダイレクトへ変えると、同じ指定だと思っていても保存結果が変わる場合があります。利用するコマンドとバージョンをセットで確認してください。
-NoTypeInformationは、型の情報をCSVの先頭へ出さないための指定です。古い環境との違いを減らすため、この例では明示しています。先頭に余計な行がある問題と、文字化けの問題は別々に確認します。
Excelで開く確認は別に行う
この例はPowerShellでの読み戻しとバイト列の確認です。Excelで開いたときの表示を確認した結果ではありません。取り込み方法や設定によって、識別子が数値と解釈される場合もあります。BOMを付けたら先頭ゼロも必ず保たれる、とは考えないようにします。
受け手がExcelを使うなら、文字コードと列の型を指定して取り込む手順も含めて確認します。CSV内の値が「0012」のままでも、画面側が12と表示する場合は、保存時と読込時のどこで変わったのかを分けて追います。
文字化けした元ファイルを残す
既存のCSVが読めないときは、元ファイルを保存したまま、出力元の文字コードを確認します。読み方を変えて文字化けした内容を、そのまま同名で保存し直すと、元のバイト列を失う場合があります。
練習ではWindows PowerShell 5.1とPowerShell 7で同じコードを動かし、指定したBOMと値が残る範囲を確認します。実際の受取環境と照合する際は、バージョン、使ったコマンド、文字コード、取り込み手順を一緒に記録してください。
関連する記事
Pythonでファイルを読み書きする基本|txt・csv・jsonの使い分け
公式資料
about_Character_Encoding – PowerShell | Microsoft Learn
Export-Csv (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
Import-Csv (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
