2008-11-12 7 views
5

Ich habe ein kleines C# Konsolenprogramm, das etwas Text mit Console.WriteLine ausgibt. Ich habe dann Rohr diese Ausgabe in eine Text-Datei wie:Windows cmd Rohr nicht Unicode auch mit/U Schalter

c:myprogram > textfile.txt

jedoch die Datei immer eine ANSI-Textdatei ist, auch wenn ich starte cmd mit der Option/u wechseln. cmd /? sagt über die Option/U:

/U Ausgabe interner Befehle an ein Rohr oder eine Datei Unicode

Und es macht einen Unterschied in der Tat zu sein, die Ursachen, wenn ich ein

tun

c:echo "foo" > text.txt

die text.txt ist Unicode (ohne BOM)

ich frage mich, warum kochend die Ausgabe von Mein Konsolenprogramm in eine neue Datei erstellt ebenfalls keine Unicode-Datei und wie könnte ich das ändern?

Ich benutze nur Windows Power Shell (die eine Unicode-Datei mit der richtigen Stückliste erzeugt), aber ich würde immer noch gerne wissen, wie es mit cmd geht.

Danke!

Antwort

6

Der/U-Schalter, wie die Dokumentation sagt, beeinflusst, ob interne Befehle Unicode-Ausgabe generieren. Ihr Programm gehört nicht zu den internen Befehlen von cmd.exe, daher hat die Option/U keinen Einfluss darauf.

Um eine Unicode-Textdatei zu erstellen, müssen Sie sicherstellen, dass Ihr Programm Unicode-Text generiert.

Auch das kann nicht genug sein, obwohl. Ich bin auf this blog from Junfeng Zhang gestoßen, das beschreibt, wie man Unicodetext in ein Konsolenprogramm schreibt. Es überprüft den Dateityp des Standard-Ausgabehandles. Für Zeichendateien (ein Konsolen- oder LPT-Port) wird WriteFileW aufgerufen. Für alle anderen Typen von Handles (einschließlich Disk-Dateien und Pipes) wird die Ausgabestring in die aktuelle Codepage der Konsole konvertiert. Ich fürchte, ich weiß nicht, wie sich das in .NET-Begriffen niederschlägt.

2

Ich habe gesehen, wie mscorlib Console.WriteLine implementiert, und es scheint zu entscheiden, welche Text-Ausgabe-Codierung basierend auf einem Aufruf an GetConsoleOutPutCP zu verwenden. Ich rate (habe aber noch nicht bestätigt), dass die zurückgegebene Codepage für eine PS-Konsole anders ist als für eine cmd-Konsole, so dass mein Programm tatsächlich nur ansi ausgibt, wenn es von cmd aus läuft.

+0

Ja, ich denke, dass Sie damit etwas anfangen. –

+0

Die Konsolen-Codepage wird mit 'SetConsoleOutputCP' festgelegt. Sie können festlegen, was Sie wollen - PS setzt es auf Unicode, und Sie können dasselbe tun, wenn Sie P/Invoke verwenden möchten. – Ben