Множество панелей навигации

Следующие коды являются моими кодами 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');
1
задан Mike H 22 March 2019 в 02:55
поделиться