【PowerShell】ファイルの文字コード UFT8の「BOM付き・BOMなし」のみ変換する方法

【PowerShell】ファイルの文字コード UFT8の「BOM付き・BOMなし」のみ変換する方法

PowerShellによるファイルの文字コードUFF8の「BOM付き・BOMなし」のみを対象に変換する方法を記載します。

<環境>
OS:Windows10(64bit)
PSVersion:v5.1

バイト配列による変換

FileクラスのReadAllBytesメソッドとWriteAllBytesメソッドはファイルをバイト配列で扱います。 BOMのバイト配列をファイルに付与する、またはファイルから除去することで、UFF8の「BOM付き・BOMなし」のみ対象に変換します。

  • 「BOM付き」から「BOMなし」に変換する
  • # BOM付きファイルをバイト配列で読み込み
    $FileBytes = [System.IO.File]::ReadAllBytes($BOMPath)
    
    # BOMのバイト配列(先頭3バイト)を除去して書き込み
    [System.IO.File]::WriteAllBytes($NoBOMPath, $FileBytes[3..($FileBytes.Length - 1)])
    

  • 「BOMなし」から「BOM付き」に変換する
  • # BOMのバイト配列を取得
    $BOM = [System.Text.Encoding]::UTF8.GetPreamble()
    
    # BOMなしファイルをバイト配列で読み込み
    $FileBytes = [System.IO.File]::ReadAllBytes($NoBOMPath)
    
    # BOMのバイト配列を付与して書き込み
    [System.IO.File]::WriteAllBytes($BOMPath, $BOM + $FileBytes)
    

PowerShellによるUFF8「BOM付き・BOMなし」変換はSet-ContentコマンドレットやFileクラスのWriteAllLinesメソッドなども使用できます。
ただし、これらのメソッドは改行コード(CR+LF)が行末尾に自動付与されるため、変更前と比べて改行コードが異なる、改行コードが最終行に追加される場合があることの考慮が必要です。
そのため、UTF8の「BOM付き・BOMなし」のみ変換したい場合は、バイト配列を使用して変換するのが良いと思われます。


Next Post Previous Post