Вот мое понимание того, как определять семейство текстовых кодировок Unicode через BOM. Точность этого метода низкая, так как этот метод работает только с текстовыми файлами (в частности, с файлами Unicode), и по умолчанию используется, ascii
когда отсутствует спецификация (как и большинство текстовых редакторов, по умолчанию будет, UTF8
если вы хотите соответствовать HTTP / веб-экосистеме). ).
Обновление 2018 : я больше не рекомендую этот метод. Я рекомендую использовать file.exe из GIT или * nix tools в соответствии с рекомендациями @Sybren, и я покажу, как это сделать с помощью PowerShell, в более позднем ответе .
# from https://gist.github.com/zommarin/1480974
function Get-FileEncoding($Path) {
$bytes = [byte[]](Get-Content $Path -Encoding byte -ReadCount 4 -TotalCount 4)
if(!$bytes) { return 'utf8' }
switch -regex ('{0:x2}{1:x2}{2:x2}{3:x2}' -f $bytes[0],$bytes[1],$bytes[2],$bytes[3]) {
'^efbbbf' { return 'utf8' }
'^2b2f76' { return 'utf7' }
'^fffe' { return 'unicode' }
'^feff' { return 'bigendianunicode' }
'^0000feff' { return 'utf32' }
default { return 'ascii' }
}
}
dir ~\Documents\WindowsPowershell -File |
select Name,@{Name='Encoding';Expression={Get-FileEncoding $_.FullName}} |
ft -AutoSize
Рекомендация: Это может работать достаточно хорошо , если dir
, ls
или Get-ChildItem
только проверяет известные текстовые файлы, и когда вы смотрите только для «плохих кодировок» из известного списка инструментов. (т. е. SQL Management Studio по умолчанию использует UTF16, что нарушило GIT auto-cr-lf для Windows, которое было по умолчанию в течение многих лет.)