When you save something as UTF-8 in PowerShell, it, most likely, will be as UTF-8 with BOM. This can be a problem if there is characters not in the 7-bit ASCII character set it won’t be handled properly. So latin, non-latin, chinese, … are not handled by it.
The good news is from PowerShell 6+ the encoding is UTF8.
What is BOM ?
BOM stand for Byte Order Mark. It is an optional Unicode character. It indicate the endianness of the encoding.
How to save in UTF-8 without BOM
In a nutshell what you need to set false on the attribute with:
After that, it’s a matter to save the encoding setting for the file. Here’s 2 examples XML and text file as a bonus the text file example manipulate JSON file.
[XML] $XmlDocument = ( Select-Xml -Path $FilePath -XPath / ).Node [System.Xml.XmlWriterSettings] $XmlSettings = New-Object System.Xml.XmlWriterSettings #Preserve Windows formating $XmlSettings.Indent = $true #Keeping UTF-8 without BOM $XmlSettings.Encoding = New-Object System.Text.UTF8Encoding($false) [System.Xml.XmlWriter] $XmlWriter = [System.Xml.XmlWriter]::Create($FilePath, $XmlSettings) $XmlDocument.Save($XmlWriter) #Close Handle and flush $XmlWriter.Dispose()
Text file Edition
Here’s is a JSON example.
$FilePath = "C:\MyFolder\textfile.json" $FileContent = Get-Content -Path $FilePath | ConvertFrom-Json $UTF8Only = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllLines($FilePath, @($FileContent | ConvertTo-Json), $UTF8Only)