#文字コード変換したいけど・・・
まだまだIBMホストが動いているのか文字コードをEBCDICにして納品する先がありました。
SJIS⇒UTF-8はサクラエディタなどで簡単に変換できますがEBCDICとなると話は別。
WindowsPCの標準機能で解決するとしたらPowerShellかなぁと思いいろいろ調べました。
こちらをほぼほぼそのまま流用させていただきました
そして出来上がったのがこちら。
Convert.ps1
# スクリプトファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
[String]$in = "BEFORE",
[String]$out = "AFTER",
[String]$from = "Shift-JIS",
[String]$to = "IBM290"
)
# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
# 与えられたパスから合致するファイルリストを再帰的に取得
Get-ChildItem $in -recurse |
# 取得したファイルを順番に処理
ForEach-Object {
# 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
if($_.GetType().Name -eq "FileInfo"){
# 変換元ファイルをStreamReaderオブジェクトで読み込み
$reader = New-Object IO.StreamReader($_.FullName, $enc_f)
# 保存先のパス、保存先の親フォルダのパスを生成
$o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
$o_folder = Split-Path $o_path -parent
# 保存先のフォルダが存在しない場合にフォルダを自動生成
if(!(Test-Path $o_folder)){
[Void][IO.Directory]::CreateDirectory($o_folder)
}
# 保存先ファイルをStreamWriterオブジェクトでオープン
$writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
# 変換元ファイルを順に読み込み、保存先ファイルに書き込み
$tmp = $reader.Readtoend()
$reader.Close()
$tmp = $tmp -replace "`r`n",''
$writer.Write($tmp)
# ファイルをすべてクローズ
$writer.Close()
}
}
同じ階層にBEFOREフォルダを作成して、その中に変換したいファイルを放り込んで実行するとAFTERフォルダの中に文字コード変換後のファイルが同名で作成されます。
今回は改行コードなしだったので最後にCRLFを削除してますのでご注意を。
#SJISからUTF-8(BOMなし)も・・・
今度はUTF-8への変換ということでファイルの容量も大きいことからPG流用したところBOM付きのためリテイク。
いろいろと調べてBOMなしの時はこちら。
Convert2.ps1
# スクリプトファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
[String]$in = "BEFORE",
[String]$out = "AFTER",
[String]$from = "Shift-JIS",
[String]$to = "UTF-8"
)
# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
# BOMなしの場合はオブジェクト作成!!
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
# 与えられたパス(c:\tmp\convert)から合致するファイルリストを再帰的に取得
Get-ChildItem $in -recurse |
# 取得したファイルを順番に処理
ForEach-Object {
# 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
if($_.GetType().Name -eq "FileInfo"){
# 変換元ファイルをStreamReaderオブジェクトで読み込み
$reader = New-Object IO.StreamReader($_.FullName, $enc_f)
# 保存先のパス、保存先の親フォルダのパスを生成
$o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
$o_folder = Split-Path $o_path -parent
# 保存先のフォルダが存在しない場合にフォルダを自動生成
if(!(Test-Path $o_folder)){
[Void][IO.Directory]::CreateDirectory($o_folder)
}
# 保存先ファイルをStreamWriterオブジェクトでオープン
$writer = New-Object IO.StreamWriter($o_path, $false, $Utf8NoBomEncoding)
# 変換元ファイルを順に読み込み、保存先ファイルに書き込み
$tmp = $reader.Readtoend()
$reader.Close()
$tmp = $tmp -replace "`r`n","`n"
$writer.Write($tmp)
# ファイルをすべてクローズ
$writer.Close()
}
}