Следующие коды являются моими кодами Powershell, чтобы определить, кодируют ли некоторые файлы cpp или h или ml кодировку с ISO-8859-1 (Latin-1) или UTF-8 без спецификации, если ни то, ни другое предполагают, что это GB18030.Я - китаец, работающий во Франции, и MSVC сохраняет на французском компьютере как Latin-1, а на китайском компьютере - как GB, так что это помогает мне избежать проблем с кодированием при обмене исходными файлами между моей системой и моими коллегами.
Это простой способ, если все символы находятся между x00-x7E, ASCII, UTF-8 и Latin-1 одинаковы, но если я прочитаю не ASCII-файл UTF-8, мы найдем специальный символ � show up,так что попробуй читать с латиницей-1.В Latin-1 между \ x7F и \ xAF пусто, в то время как GB использует full между x00-xFF, поэтому, если я получу любое из двух значений, это не Latin-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');