Functions/Data/Get-FileEncoding.ps1

Function Get-FileEncoding
{
    [CmdletBinding()]
    param
    (
        [Alias("PSPath")]
        [Parameter(Mandatory = $True, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)]
        [String]
        $Path,

        [Parameter(Mandatory = $False)]
        [System.Text.Encoding]
        $DefaultEncoding = [System.Text.Encoding]::ASCII
    )
    
    process
    {
        $File = get-item $Path
        [Byte[]]$bom = Get-Content -Encoding Byte -ReadCount 4 -TotalCount 4 -Path $Path
        
        $encoding_found = $false
        $EncodingRefs = $Global:PS_FileEncodings | where PSName -notin ("string","bigendianUTF32")
        $Encodings = foreach ($Ref in $EncodingRefs) {([System.Text.Encoding]::GetEncoding($REF.BodyName))}
        foreach ($encoding in $Encodings)
        {
            $preamble = $encoding.GetPreamble()
            if ($preamble)
            {
                foreach ($i in 0..$preamble.Length)
                {
                    if ($preamble[$i] -ne $bom[$i]) {break} elseif ($i -eq $preamble.Length){$encoding_found = $encoding}
                }
            }
        }
        
        if (!$encoding_found){$encoding_found = $DefaultEncoding}
    
        [pscustomobject]([ordered]@{
            Name = $File.name
            EncodingBN = $Encoding_found.BodyName
            EncodingPS = ($EncodingRefs | where bodyname -eq $Encoding_found.BodyName).Psname
            Path=$File.FullName
        })
 
    }
}