361 Stimmen

Wie verwendet man Unicode-Zeichen in der Windows-Befehlszeile?

Wir haben ein Projekt in Team Foundation Server (TFS), das ein nicht-englisches Zeichen (š) enthält. Beim Versuch, ein paar Build-bezogene Dinge zu skripten, sind wir über ein Problem gestolpert - wir können nicht die š Brief an die Befehlszeilentools. Die Eingabeaufforderung oder was auch immer bringt es durcheinander, und die tf.exe Das Dienstprogramm kann das angegebene Projekt nicht finden.

Ich habe verschiedene Formate für die .bat-Datei ausprobiert (ANSI, UTF-8 mit und ohne STÜCKLISTE ) sowie die Erstellung eines Skripts in JavaScript (das von Haus aus Unicode ist) - aber ohne Erfolg. Wie führe ich ein Programm aus und übergebe ihm eine Unicode Befehlszeile?

438voto

kgiannakakis Punkte 100768

Versuchen Sie es:

chcp 65001

was die Codepage in UTF-8 ändert. Außerdem müssen Sie die Lucida-Konsolenschriftarten verwenden.

106voto

Ilya Zakharevich Punkte 1050

Mein Hintergrund: Ich verwende seit Jahren Unicode-Eingabe/Ausgabe in einer Konsole (und tue dies auch täglich. Außerdem entwickle ich Hilfsmittel für genau diese Aufgabe). Es gibt nur sehr wenige Probleme, sofern Sie die folgenden Fakten/Einschränkungen verstehen:

  • CMD und "Konsole" sind voneinander unabhängige Faktoren. CMD.exe ist eines der Programme, die in einer Konsole "arbeiten" können ("Konsolenanwendungen").
  • AFAIK, CMD hat perfekte Unterstützung für Unicode; Sie können alle Unicode-Zeichen eingeben/ausgeben, wenn jede Codepage ist aktiv.
  • Die Windows-Konsole bietet VIEL Unterstützung für Unicode, aber sie ist nicht perfekt (nur "gut genug"; siehe unten).
  • chcp 65001 ist sehr gefährlich. Solange ein Programm nicht speziell für die Umgehung von Fehlern in der Windows-API entwickelt wurde (oder eine C-Laufzeitbibliothek verwendet, die diese Umgehungen bietet), würde es nicht zuverlässig funktionieren. Win8 behebt ½ dieser Probleme mit cp65001 aber der Rest ist immer noch auf Win10 anwendbar .
  • Ich arbeite in cp1252 . Wie ich bereits sagte: Um Unicode in einer Konsole ein-/auszugeben, muss man die Codepage nicht einstellen .

Die Einzelheiten

  • Um Unicode auf einer Konsole zu lesen/schreiben, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) so intelligent sein, dass sie nicht File-I/O API, sondern Console-I/O API. (Für ein Beispiel siehe wie Python das macht .)
  • Um Unicode-Befehlszeilenargumente zu lesen, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um die entsprechende API zu verwenden.
  • Das Rendering von Konsolenschriften unterstützt nur Unicode-Zeichen in BMP (mit anderen Worten: unter U+10000 ). Es wird nur einfaches Textrendering unterstützt (daher sollten europäische und einige ostasiatische Sprachen problemlos funktionieren, sofern man vorkomponierte Formen verwendet). [Es gibt eine Kleines Kleingedrucktes hier für Ostasien und für die Zeichen U+0000, U+0001, U+30FB].

Praktische Überlegungen

  • En Standardwerte auf Window sind nicht sehr hilfreich. Um die beste Erfahrung zu machen, sollte man 3 Teile der Konfiguration abstimmen:

    • Für die Ausgabe: eine umfassende Konsolenschriftart. Für beste Ergebnisse empfehle ich meine Bauten . (Die Installationsanweisungen sind dort zu finden - und auch in anderen Antworten auf dieser Seite aufgeführt).
    • Für die Eingabe: ein geeignetes Tastaturlayout. Für beste Ergebnisse empfehle ich meine Layouts .
    • Zur Eingabe: HEX-Eingabe von Unicode erlauben .
  • Ein weiteres Problem beim "Einfügen" in eine Konsolenanwendung (sehr technisch):

    • Die HEX-Eingabe liefert ein Zeichen auf KeyUp von Alt ; todos die anderen Möglichkeiten, ein Zeichen zu liefern, geschehen auf KeyDown so viele Bewerbungen sind nicht bereit, ein Zeichen auf KeyUp . (Gilt nur für Anwendungen, die Console-I/O API.)
    • Fazit: Viele Anwendungen würden nicht auf HEX-Eingabeereignisse reagieren.
    • Außerdem hängt es von der aktuellen Tastaturbelegung ab, was mit einem "eingefügten" Zeichen geschieht: Wenn das Zeichen ohne Verwendung von Präfix-Tasten eingegeben werden kann (aber mit einer beliebigen komplizierten Kombination von Modifikatoren, wie in Ctrl-Alt-AltGr-Kana-Shift-Gray* ), dann wird sie bei einem emulierten Tastendruck übermittelt. Das ist es, was jede Anwendung erwartet - es ist also in Ordnung, etwas einzufügen, das nur solche Zeichen enthält.
    • Die "anderen" Figuren werden jedoch geliefert von HEX-Eingabe emulieren .

    Schlussfolgerung : Es sei denn, Ihr Tastaturlayout unterstützt die Eingabe von VIELEN Zeichen ohne Vorwahltasten, einige fehlerhafte Anwendungen kann Zeichen auslassen, wenn Sie Paste über die Benutzeroberfläche der Konsole: Alt-Space E P . ( Diese deshalb empfehle ich die Verwendung meiner Tastaturlayouts!)

Man sollte auch nicht vergessen, dass die "alternativen, 'leistungsfähigeren' Konsolen" für Windows gar keine Konsolen sind . Sie unterstützen nicht Console-I/O APIs, so dass die Programme, die auf diese APIs angewiesen sind, nicht funktionieren würden. (Die Programme, die nur "File-I/O APIs to the console filehandles" verwenden, würden jedoch problemlos funktionieren).

Ein Beispiel für eine solche Nicht-Konsole ist ein Teil von MicroSofts Powershell . Ich benutze es nicht; zum Experimentieren, drücken und loslassen WinKey und geben Sie dann powershell .


(Andererseits gibt es Programme wie ConEmu o ANSICON die versuchen, mehr zu tun: Sie "versuchen" abzufangen Console-I/O APIs, damit auch "echte Konsolenanwendungen" funktionieren. Dies funktioniert auf jeden Fall für Spielzeug-Beispielprogramme; im wirklichen Leben kann dies Ihre speziellen Probleme lösen oder auch nicht. Experiment).

Zusammenfassung

  • Schriftart und Tastaturlayout festlegen (und optional HEX-Eingabe zulassen).

  • nur Programme verwenden, die über Console-I/O APIs, und akzeptieren Unicode-Befehlszeilenargumente. Zum Beispiel kann jede cygwin -kompilierte Programm sollte in Ordnung sein. Wie ich bereits sagte, CMD ist auch in Ordnung.

UPD: Ursprünglich, für einen Fehler in cp65001 Ich habe Kernel- und CRTL-Ebenen verwechselt ( UPD²: und Windows-Benutzermodus-API!). Auch: Win8 behebt die eine Hälfte dieses Fehlers; ich habe den Abschnitt über die "bessere Konsolenanwendung" präzisiert und einen Verweis darauf hinzugefügt, wie Python das macht.

42voto

vanna Punkte 369

Ich hatte dasselbe Problem (ich komme aus der Tschechischen Republik). Ich habe eine englische Windows-Installation, und ich muss mit Dateien auf einem freigegebenen Laufwerk arbeiten. Die Pfade zu den Dateien enthalten tschechische Sonderzeichen.

Die Lösung, die für mich funktioniert, ist:

Ändern Sie in der Batch-Datei die Zeichensatzseite

Meine Batch-Datei:

chcp 1250
copy "O:\VEREJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

Die Batch-Datei muss im CP 1250 gespeichert werden.

Beachten Sie, dass die Konsole die Zeichen nicht korrekt anzeigt, aber sie versteht sie...

33voto

Maxim Yefremov Punkte 12593

Überprüfen Sie die Sprache für Nicht-Unicode-Programme. Wenn Sie Probleme mit Russisch in der Windows-Konsole haben, dann sollten Sie hier Russisch einstellen:

Changing language for non-Unicode programs

16voto

Alon Or Punkte 728

Auf einem Windows 10 x64-Rechner habe ich dafür gesorgt, dass die Eingabeaufforderung nicht-englische Zeichen anzeigt:

Öffnen Sie eine erweiterte Eingabeaufforderung (führen Sie CMD.EXE als Administrator aus). Fragen Sie Ihre Registrierung nach verfügbaren TrueType-Schriften auf der Konsole ab, indem Sie:

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

Sie werden eine Ausgabe wie diese sehen:

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *
    932    REG_SZ    * 

Jetzt müssen wir eine TrueType-Schriftart hinzufügen, die die von Ihnen benötigten Zeichen unterstützt, wie z. B. Courier New. Dazu fügen wir dem Zeichenkettennamen Nullen hinzu, in diesem Fall wäre die nächste Null also "000":

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

Jetzt implementieren wir UTF-8-Unterstützung:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

Setzen Sie die Standardschriftart auf "Courier New":

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

Setzen Sie die Schriftgröße auf 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

Aktivieren Sie die Schnellbearbeitung, wenn Sie möchten:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X