Konvertieren Sie eine Textdatei von ansi in UTF-8 in Windows Batch-Skripts

10305
Raj

Wir haben eine Textdatei im ANSI-Standardformat, die in das UTF-8-Format konvertiert werden muss. Gibt es eine Möglichkeit, die allgemeinen Windows-DOS-Befehle zum Konvertieren der Datei zu verwenden? Wir können die PowerShell verwenden, aber nur diese Befehlszeile muss von einem anderen Batch-Prozess ausgeführt werden.

0

2 Antworten auf die Frage

3

Die PowerShell-Syntax ist ziemlich unkompliziert. Dieser Befehl öffnet eine Datei in der Standardcodierung und speichert sie als UTF-8 mit Stückliste:

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

Der EncodingParameter akzeptiert Folgendes :Ascii, BigEndianUnicode, BigEndianUTF32, Byte, Default, Oem, String, Unicode, Unknown, UTF32, UTF7, UTF8

1
pholpar

Get-Content ist möglicherweise nicht optimal, da die Eingabedatei zeilenweise verarbeitet wird (zumindest standardmäßig, wenn Sie den RawSchalter nicht wie später beschrieben verwenden). Dies kann zu einer Änderung des Zeilenendes führen (z. B. beim Verschieben) Textdateien zwischen Unix- und Windows-Systemen). Ich hatte gerade deshalb ernsthafte Probleme mit einem Skript und es dauerte ungefähr eine Stunde, um den genauen Grund zu finden. Mehr dazu in diesem Beitrag . Aufgrund dieses Verhaltens ist Get-Content auch nicht die beste Wahl, wenn die Leistung von Bedeutung ist.

Stattdessen können Sie PowerShell in Kombination der .NET-Klassen verwenden (sofern auf Ihrem System eine Version von .NET Framework installiert ist):

$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() 

Oder noch einfacher: Verwenden Sie den RawSchalter wie hier beschrieben, um diesen Overhead zu vermeiden, und lesen Sie den Text in einem einzigen Block:

Get-Content $inFile -Raw 
Sie haben Ihren StreamsReader und StreamWriter mit falscher Kodierung initialisiert. vor 6 Jahren 0