Konwertuj plik tekstowy z ansi na UTF-8 w skryptach wsadowych systemu Windows


0

Mamy plik tekstowy w domyślnym formacie ANSI, który należy przekonwertować na format UTF-8. Czy jest jakiś sposób, w jaki możemy użyć ogólnych poleceń systemu Windows DOS do konwersji pliku? Możemy używać PowerShell, ale tylko ten wiersz poleceń musi być uruchamiany z innego procesu wsadowego.

Odpowiedzi:


2

Składnia PowerShell jest raczej prosta. To polecenie otwiera plik w domyślnym kodowaniu i zapisuje go jako UTF-8 z BOM:

Get-Content <SrcFile.txt> -Encoding Oem | Out-File <DestFile.txt> -Encoding utf8

Ten Encodingparametr przyjmuje następujące elementy :Ascii, BigEndianUnicode, BigEndianUTF32, Byte, Default, Oem, String, Unicode, Unknown, UTF32, UTF7, UTF8


1

Get-Content może nie być optymalny, ponieważ obsługuje plik wejściowy linia po linii (przynajmniej domyślnie, jeśli nie użyjesz Rawprzełącznika, jak opisano później), i może spowodować zmianę zakończenia linii (na przykład, jeśli przesuniesz pliki tekstowe między systemami Unix i Windows). Miałem poważne problemy ze skryptem tylko dlatego, że znalezienie dokładnej przyczyny zajęło około godziny. Zobacz więcej na ten temat w tym poście . Ze względu na takie zachowanie Get-Content również nie jest najlepszym wyborem, jeśli liczy się wydajność.

Zamiast tego można używać programu PowerShell w połączeniu z klasami .NET (o ile w systemie jest zainstalowana wersja .NET Framework):

$sr = New-Object System.IO.StreamReader($infile) 
$sw = New-Object System.IO.StreamWriter($outfile, $false, [System.Text.Encoding]::Default)

$sw.Write($sr.ReadToEnd())

$sw.Close()
$sr.Close() 
$sw.Dispose()
$sr.Dispose()

Lub jeszcze prościej, użyj Rawprzełącznika, jak opisano tutaj, aby uniknąć tego narzutu i przeczytaj tekst w jednym bloku:

Get-Content $inFile -Raw

Zainicjowałeś StreamsReader i StreamWriter z nieprawidłowym kodowaniem.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.