MENU

PowerShellでCSVの文字化けを防ぐ

当ページのリンクには広告(PR)が含まれていることがあります。
PowerShellでCSVの文字化けを防ぐ。日本語のCSV、文字コードを指定、保存形式を照合の処理例。

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と値が残る範囲を確認します。実際の受取環境と照合する際は、バージョン、使ったコマンド、文字コード、取り込み手順を一緒に記録してください。

関連する記事

スクレイピング結果をCSV保存|文字コードとExcel

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

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次