Skip to content

📝 XML-Dateien in UTF-8 ohne BOM konvertieren (PowerShell, optimiert)

Zweck

Dieses Skript konvertiert XML-Dateien nur dann, wenn sie tatsächlich konvertiert werden müssen: - Wenn die Datei UTF-16 ist. - Wenn die Datei UTF-8 mit BOM ist.

Dateien, die bereits UTF-8 ohne BOM sind, werden nicht neu geschrieben → schneller bei großen Datenmengen.


Optimiertes PowerShell-Skript

Param (
    [Parameter(Mandatory = $True)]
    [String]$SourcePath
)

# Prüfen, ob wir PowerShell 7+ verwenden
$IsPwsh7 = $PSVersionTable.PSVersion.Major -ge 7

# Alle XML-Dateien rekursiv suchen
Get-ChildItem -Path $SourcePath -Recurse -Include *.xml | ForEach-Object {

    # Datei als Bytes laden, um Encoding zu erkennen
    $bytes = [System.IO.File]::ReadAllBytes($_.FullName)

    # Prüfen auf UTF-8 BOM (EF BB BF)
    $hasBom = $bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF

    # Prüfen auf UTF-16 BOM (FF FE oder FE FF)
    $isUtf16 = ($bytes.Length -ge 2 -and
               (($bytes[0] -eq 0xFF -and $bytes[1] -eq 0xFE) -or ($bytes[0] -eq 0xFE -and $bytes[1] -eq 0xFF)))

    # Überspringen, wenn weder UTF-16 noch UTF-8-BOM
    if (-not $hasBom -and -not $isUtf16) {
        Write-Host "Übersprungen: $($_.FullName)"
        return
    }

    # Inhalt als String laden
    $content = Get-Content -Path $_.FullName -Raw

    # XML-Header-Encoding korrigieren
    $newContent = $content -replace '(?<=<\?xml\s+version="1\.0"\s+encoding=")([^"]+)', 'UTF-8'

    if ($IsPwsh7) {
        # PowerShell 7+ → BOM-frei speichern
        Set-Content -Path $_.FullName -Value $newContent -Encoding utf8NoBOM
    }
    else {
        # Windows PowerShell 5.1 → UTF-8 ohne BOM via .NET-API
        $utf8NoBom = New-Object System.Text.UTF8Encoding($False)
        [System.IO.File]::WriteAllText($_.FullName, $newContent, $utf8NoBom)
    }

    Write-Host "Konvertiert: $($_.FullName)"
}

Funktionsweise

  1. Dateien finden → Alle XML-Dateien werden rekursiv durchsucht.
  2. Encoding prüfen → BOM wird über Rohdaten ermittelt.
  3. Nur notwendige Konvertierungen → Spart Zeit und unnötige Schreibvorgänge.
  4. XML-Header korrigierenencoding="UTF-8" wird automatisch gesetzt.
  5. Dateien ohne BOM speichern.

Beispiel

Vorher (UTF-16 mit BOM):

<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<root>
    <value>Hello</value>
</root>

Nachher (UTF-8 ohne BOM):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <value>Hello</value>
</root>

Verwendung

.\Convert-XmlToUtf8_Optimized.ps1 -SourcePath "C:\Projekte\XML"

Vorteile dieser Version

  • ✅ Prüft BOM und Encoding vor der Konvertierung
  • ✅ Bearbeitet nur betroffene Dateien
  • ✅ Spart Schreibvorgänge → schneller
  • ✅ Funktioniert mit Windows PowerShell 5.1 und PowerShell 7+

Hinweise

  • Originaldateien werden überschrieben → ggf. vorher Backup anlegen: powershell Copy-Item $SourcePath "$SourcePath\Backup" -Recurse
  • Kann bei Bedarf leicht für weitere Dateitypen angepasst werden.