Los siguientes códigos son mis códigos de PowerShell para determinar si algunos archivos cpp o ho ml se encodeding con la norma ISO-8859-1 (Latin-1) o UTF-8 sin BOM, si ninguno supone que es GB18030. Soy un chino que trabaja en Francia y MSVC ahorra como Latin-1 en una computadora francesa y guarda como GB en una computadora china, así que esto me ayuda a evitar problemas de codificación cuando los intercambios de archivos fuente entre mi sistema y mis colegas.
El camino es simple, si todos los caracteres están entre x00-x7E, ASCII, UTF-8 y Latin-1 son todos iguales, pero si leo un archivo no ASCII de UTF-8, encontraremos el especial el carácter aparece, así que intenta leer con Latin-1.En Latin-1, entre \ x7F y \ xAF está vacío, mientras que GB usa completo entre x00-xFF, por lo que si tengo alguno entre los dos, no es Latin-1
El código está escrito en PowerShell, pero lo usa. neto así que es fácil de traducir a C# o 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');
posible duplicado de [Java: Cómo determinar la codificación de juego de caracteres correcto de una corriente ] (http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream) – Oded
¿Qué codificaciones? UTF-8 vs UTF-16, grande vs little endian? ¿O se refiere a las viejas páginas de códigos de MSDos, como shift-JIS o cirílico, etc.? – dthorpe
Otro posible duplicado: http://stackoverflow.com/questions/436220/python-is-herehere-a-way-to-determine-the-encoding-of-text-file – Oded