Следующие коды являются моими кодами Powershell для определения того, кодируются ли некоторые файлы cpp или h или ml с ISO-8859-1 (Latin-1) или UTF-8 без спецификации, если они не предполагают, что это будет GB18030. Я - китайский, работающий во Франции, и MSVC экономит как латинский-1 на французском компьютере и сохраняет его как GB на китайском компьютере, поэтому это помогает мне избежать проблемы с кодированием, когда происходит обмен файлами между моей системой и моими коллегами.
Путь прост, если все символы находятся между x00-x7E, ASCII, UTF-8 и Latin-1 все одинаковы, но если я прочитал файл без ASCII по UTF-8, мы найдем специальный символ , поэтому попробуйте прочитать с Latin-1. В латинском-1 между \ x7F и \ xAF пусто, тогда как GB использует полные значения между x00-xFF, поэтому, если у меня есть какой-либо из двух, это не латинский-1
. Код написан в PowerShell, но использует .net, поэтому его легко перевести на C # или F #
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach($i in Get-ChildItem .\ -Recurse -include *.cpp,*.h, *.ml) {
$openUTF = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::UTF8)
$contentUTF = $openUTF.ReadToEnd()
[regex]$regex = '�'
$c=$regex.Matches($contentUTF).count
$openUTF.Close()
if ($c -ne 0) {
$openLatin1 = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('ISO-8859-1'))
$contentLatin1 = $openLatin1.ReadToEnd()
$openLatin1.Close()
[regex]$regex = '[\x7F-\xAF]'
$c=$regex.Matches($contentLatin1).count
if ($c -eq 0) {
[System.IO.File]::WriteAllLines($i, $contentLatin1, $Utf8NoBomEncoding)
$i.FullName
}
else {
$openGB = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('GB18030'))
$contentGB = $openGB.ReadToEnd()
$openGB.Close()
[System.IO.File]::WriteAllLines($i, $contentGB, $Utf8NoBomEncoding)
$i.FullName
}
}
}
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');