Wir haben ein Projekt in Team Foundation Server (TFS), das ein nicht englisches Zeichen (š) enthält. Beim Versuch, einige Build-bezogene Dinge zu skripten, sind wir auf ein Problem gestoßen - wir können den Buchstaben š nicht an die Befehlszeilentools weitergeben. Die Eingabeaufforderung oder was sonst nicht vermasselt, und das Dienstprogramm tf.exe kann das angegebene Projekt nicht finden.
Ich habe verschiedene Formate für die .bat-Datei (ANSI, UTF-8 mit und ohne Stückliste ) sowie die Skripterstellung in JavaScript (das von Natur aus Unicode ist) ausprobiert - aber kein Glück. Wie führe ich ein Programm aus und übergebe ihm eine Unicode- Befehlszeile?
Antworten:
Mein Hintergrund: Ich verwende die Unicode-Eingabe / Ausgabe jahrelang in einer Konsole (und mache das viel täglich. Außerdem entwickle ich Support-Tools für genau diese Aufgabe). Soweit Sie die folgenden Fakten / Einschränkungen verstehen, gibt es nur sehr wenige Probleme:
CMD
und "Konsole" sind nicht miteinander verbundene Faktoren.CMD.exe
ist nur eines von Programmen, die bereit sind, in einer Konsole zu „arbeiten“ („Konsolenanwendungen“).CMD
unterstützt Unicode perfekt; Sie können alle Unicode-Zeichen eingeben / ausgeben, wenn eine Codepage aktiv ist.chcp 65001
ist sehr gefährlich. Wenn ein Programm nicht speziell für die Umgehung von Fehlern in der Windows-API entwickelt wurde (oder eine C-Laufzeitbibliothek mit diesen Problemumgehungen verwendet), funktioniert es nicht zuverlässig. Win8 behebt die Hälfte dieser Probleme mitcp65001
, der Rest gilt jedoch weiterhin für Win10 .cp1252
. Wie ich bereits sagte: Um Unicode in eine Konsole einzugeben / auszugeben, muss man die Codepage nicht einstellen .Die Details
File-I/O
API, sondern dieConsole-I/O
API zu verwenden. (Ein Beispiel finden Sie unter Python .)U+10000
). Es wird nur einfaches Text-Rendering unterstützt (daher sollten europäische - und einige ostasiatische - Sprachen gut funktionieren - sofern vorkomponierte Formulare verwendet werden). [Hier gibt es ein kleines Kleingedrucktes für Ostasien und für die Zeichen U + 0000, U + 0001, U + 30FB.]Praktische Überlegungen
Die Standardeinstellungen von Window sind nicht sehr hilfreich. Für die beste Erfahrung sollte man 3 Konfigurationselemente optimieren:
Noch ein Gotcha mit "Einfügen" in eine Konsolenanwendung (sehr technisch):
KeyUp
fürAlt
; Alle anderen Möglichkeiten, einen Charakter zu liefern, finden stattKeyDown
. So viele Anwendungen sind nicht bereit, einen Charakter zu sehenKeyUp
. (Gilt nur für Anwendungen, dieConsole-I/O
API verwenden.)Ctrl-Alt-AltGr-Kana-Shift-Gray*
) eingegeben werden kann, wird es auf einem emulierten Tastendruck geliefert. Dies ist, was jede Anwendung erwartet - daher ist es in Ordnung, alles einzufügen, das nur solche Zeichen enthält.Fazit : Wenn Ihr Tastaturlayout die Eingabe VIELER Zeichen ohne Präfixtasten nicht unterstützt, können einige fehlerhafte Anwendungen Zeichen überspringen, wenn Sie
Paste
über die Benutzeroberfläche der Konsole :Alt-Space E P
. ( Dies istwarum ich empfehle meine Tastaturlayouts!)Man sollte auch bedenken, dass die "alternativen" leistungsfähigeren "Konsolen" für Windows überhaupt keine Konsolen sind . Sie unterstützen keine
Console-I/O
APIs, daher funktionieren die Programme, die auf diesen APIs basieren, nicht. (Die Programme, die nur "Datei-E / A-APIs für die Konsolen-Dateihandles" verwenden, funktionieren jedoch einwandfrei.)Ein Beispiel für eine solche Nicht-Konsole ist ein Teil von MicroSoft
Powershell
. Ich benutze es nicht; Zum Experimentieren drücken und loslassenWinKey
und dann eingebenpowershell
.(Auf der anderen Seite gibt es Programme wie
ConEmu
oder,ANSICON
die versuchen, mehr zu tun: Sie "versuchen",Console-I/O
APIs abzufangen , damit "echte Konsolenanwendungen" auch funktionieren. Dies funktioniert definitiv für Spielzeug-Beispielprogramme; im wirklichen Leben kann dies oder kann Ihre speziellen Probleme möglicherweise nicht lösen. Experimentieren.)Zusammenfassung
Stellen Sie die Schriftart und das Tastaturlayout ein (und lassen Sie optional die HEX-Eingabe zu).
Verwenden Sie nur Programme, die
Console-I/O
APIs durchlaufen und Unicode-Befehlszeilenargumente akzeptieren. Zum Beispiel sollte jedescygwin
kompilierte Programm in Ordnung sein. Wie ich schon sagte,CMD
ist auch in Ordnung.UPD: Anfangs habe
cp65001
ich wegen eines Fehlers Kernel- und CRTL-Ebenen gemischt ( UPD²: und Windows-Benutzermodus-API!). Außerdem: Win8 behebt die Hälfte dieses Fehlers. Ich habe den Abschnitt über die Anwendung "Bessere Konsole" klargestellt und einen Verweis darauf hinzugefügt, wie Python dies tut.quelle
.log
Dateien zu urteilen , ist es ein zeitweiliger Fehler inzip -ru
[?!]. Ich habe keine Ahnung, wie ich es debuggen soll - oder in Zukunft vermeiden soll ...)Versuchen:
Dadurch wird die Codepage in UTF-8 geändert. Außerdem müssen Sie Lucida-Konsolenschriftarten verwenden.
quelle
Ich hatte das gleiche Problem (ich komme aus der Tschechischen Republik). Ich habe eine englische Installation von Windows und muss mit Dateien auf einem freigegebenen Laufwerk arbeiten. Die Pfade zu den Dateien enthalten tschechische Zeichen.
Die Lösung, die für mich funktioniert, ist:
Ändern Sie in der Batchdatei die Zeichensatzseite
Meine Batch-Datei:
Die Batchdatei muss in CP 1250 gespeichert werden.
Beachten Sie, dass die Konsole Zeichen nicht korrekt anzeigt, sie aber versteht ...
quelle
á
,é
,í
,ó
, undú
.Überprüfen Sie die Sprache für Nicht-Unicode-Programme. Wenn Sie Probleme mit Russisch in der Windows-Konsole haben, sollten Sie Russisch hier einstellen:
quelle
cmd
, sondern nur die Standardcodepage umgeschaltet, fürcp866
die noch ein 8-Bit-Zeichensatz vorhanden ist. Es verwendet sogarcp866
stattdessen,cp1251
was seine eigene Scheiße an Ärger hinzufügt.Es ist ziemlich schwierig, die Standard-Codepage der Windows-Konsole zu ändern. Wenn Sie im Internet suchen, finden Sie verschiedene Vorschläge. Einige davon können jedoch Ihr Windows vollständig beschädigen, dh Ihr PC startet nicht mehr.
Die sicherste Lösung ist die folgende: Gehen Sie zu Ihrem Registrierungsschlüssel
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
und fügen Sie String valueAutorun
= hinzuchcp 65001
.Oder Sie können dieses kleine Batch-Skript für die gängigsten Codepages verwenden.
Verwenden
@chcp 65001>nul
stattchcp 65001
die Ausgabe "Aktive Codepage: 65001" Unterdrückt" verwenden, wird sie jedes Mal angezeigt, wenn Sie ein neues Befehlszeilenfenster starten.Eine vollständige Liste aller verfügbaren Nummern erhalten Sie unter Code Page Identifiers
Beachten Sie, dass die Einstellungen nur für den aktuellen Benutzer gelten. Wenn Sie es für alle Benutzer festlegen möchten, ersetzen Sie die Zeile
SET ROOT_KEY="HKEY_CURRENT_USER"
durchSET ROOT_KEY="HKEY_LOCAL_MACHINE"
quelle
Tatsächlich besteht der Trick darin, dass die Eingabeaufforderung diese nicht englischen Zeichen tatsächlich versteht und sie einfach nicht richtig anzeigen kann.
Wenn ich an der Eingabeaufforderung einen Pfad eingebe, der einige nicht englische Zeichen enthält, wird dieser als "?? ?????? ?????" angezeigt. Wenn Sie Ihren Befehl senden (CD "??? ?????? ?????" in meinem Fall), funktioniert alles wie erwartet.
quelle
.cmd
Batchdatei muss ich jedoch immer nochchcp 65001
den Anfang der Batchdatei setzen.Auf einem Windows 10 x64-Computer ließ ich die Eingabeaufforderung nicht englische Zeichen anzeigen durch:
Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechten (führen Sie CMD.EXE als Administrator aus). Fragen Sie Ihre Registrierung nach verfügbaren TrueType-Schriftarten in der Konsole ab, indem Sie:
Sie sehen eine Ausgabe wie:
Jetzt müssen wir eine TrueType-Schriftart hinzufügen, die die von Ihnen benötigten Zeichen wie Courier New unterstützt. Wir tun dies, indem wir dem Zeichenfolgennamen Nullen hinzufügen. In diesem Fall wäre die nächste "000":
Jetzt implementieren wir die UTF-8-Unterstützung:
Stellen Sie die Standardschriftart auf "Courier New" ein:
Stellen Sie die Schriftgröße auf 20 ein:
Aktivieren Sie die Schnellbearbeitung, wenn Sie möchten:
quelle
Da ich für Python 2.7 keine vollständigen Antworten gesehen habe, werde ich die beiden wichtigen Schritte und einen optionalen Schritt skizzieren, der sehr nützlich ist.
Defaults
Option klicken . Dies ermöglicht auch den Zugriff auf Farben. Beachten Sie, dass Sie auch Einstellungen für Befehlsfenster ändern können, die auf bestimmte Weise aufgerufen werden (z. B. hier öffnen, Visual Studio), indem Sie auswählenProperties
stattdessen .cp65001
scheint der Versuch von Microsoft zu sein, UTF-7- und UTF-8-Unterstützung für die Eingabeaufforderung anzubieten. Führen Sie dazu diechcp 65001
Eingabeaufforderung aus . Einmal eingestellt, bleibt dies so, bis das Fenster geschlossen wird. Sie müssen dies jedes Mal wiederholen, wenn Sie cmd.exe starten.Eine dauerhaftere Lösung finden Sie in dieser Antwort unter Super User. Kurz gesagt, erstellen Sie einen
REG_SZ
(String) -Eintrag mit regedit atHKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
und benennen Sie ihnAutoRun
. Ändern Sie den Wert inchcp 65001
. Wenn Sie die Ausgabenachricht des Befehls nicht sehen möchten, verwenden Sie@chcp 65001>nul
stattdessen.Einige Programme haben Probleme bei der Interaktion mit dieser Codierung, wobei MinGW eine bemerkenswerte Funktion ist, die beim Kompilieren mit einer unsinnigen Fehlermeldung fehlschlägt. Dies funktioniert jedoch sehr gut und verursacht bei den meisten Programmen keine Fehler.
quelle
Ich fand diese Methode in neuen Versionen von Windows 10 nützlich:
Aktivieren Sie diese Funktion: "Beta: Verwenden Sie Unicode UTF-8 für die weltweite Sprachunterstützung"
quelle
Eine wirklich einfache Option besteht darin, eine Windows-Bash-Shell wie MinGW zu installieren und Folgendes zu verwenden:
Es gibt eine kleine Lernkurve, da Sie die Unix-Befehlszeilenfunktion verwenden müssen, aber Sie werden die Leistungsfähigkeit lieben und den Konsolenzeichensatz auf UTF-8 setzen können.
Natürlich bekommst du auch alle üblichen * nix Goodies wie grep, find, less usw.
quelle
Für ein ähnliches Problem (mein Problem bestand darin, UTF-8-Zeichen von MySQL an einer Eingabeaufforderung anzuzeigen),
Ich habe es so gelöst:
Ich habe die Schriftart der Eingabeaufforderung in Lucida Console geändert. (Dieser Schritt muss für Ihre Situation irrelevant sein. Er hat nur mit dem zu tun, was Sie auf dem Bildschirm sehen, und nicht mit dem, was wirklich der Charakter ist.)
Ich habe die Codepage in Windows-1253 geändert. Sie tun dies an der Eingabeaufforderung von "chcp 1253". Es funktionierte für meinen Fall, in dem ich UTF-8 sehen wollte.
quelle
Dieses Problem ist ziemlich ärgerlich. Normalerweise habe ich in meinem Dateinamen und Dateiinhalt ein chinesisches Schriftzeichen. Bitte beachten Sie, dass ich Windows 10 verwende. Hier ist meine Lösung:
Anzeigen des Dateinamens , z. B.
dir
oderls
wenn Sie Ubuntu bash unter Windows 10 installiert habenStellen Sie die Region so ein, dass Nicht-Utf-8-Zeichen unterstützt werden.
Danach wird die Schriftart der Konsole in die Schriftart dieses Gebietsschemas geändert und auch die Codierung der Konsole.
Nachdem Sie die vorherigen Schritte ausgeführt haben, um den Dateiinhalt einer UTF-8-Datei mithilfe des Befehlszeilentools anzuzeigen
chcp 65001
type
Befehl, um den Dateiinhalt zu überprüfen, odercat
wenn Sie Ubuntu bash unter Windows 10 installiert habenDie faulste Lösung: Verwenden Sie einfach einen Konsolenemulator wie http://cmder.net/
quelle
point
Befehlsausgabe sind immer noch verstümmelt.Ich sehe hier mehrere Antworten, aber sie scheinen die Frage nicht zu beantworten - der Benutzer möchte Unicode-Eingaben über die Befehlszeile erhalten.
Windows verwendet UTF-16 zum Codieren in zwei Byte-Zeichenfolgen, daher müssen Sie diese vom Betriebssystem in Ihrem Programm abrufen. Es gibt zwei Möglichkeiten, dies zu tun -
1) Microsoft hat eine Erweiterung, mit der main ein breites Zeichenarray aufnehmen kann: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx
2) Rufen Sie die Windows-API auf, um die Unicode-Version der Befehlszeile abzurufen. Wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw
Lesen Sie dies: http://utf8everywhere.org für detaillierte Informationen, insbesondere wenn Sie andere Betriebssysteme unterstützen.
quelle
Ab Juni 2019 müssen Sie unter Windows 10 die Codepage nicht mehr ändern.
Siehe " Einführung in Windows Terminal " (von Kayla Cinnamon ) und Microsoft / Terminal .
Durch die Verwendung der Consolas-Schriftart wird eine teilweise Unicode-Unterstützung bereitgestellt.
Wie in
Microsoft/Terminal
Ausgabe 387 dokumentiert :quelle
Eine schnelle Entscheidung für .bat-Dateien, wenn Ihr Computer Ihren Pfad / Dateinamen korrekt anzeigt, wenn Sie ihn in das DOS-Fenster eingeben:
Auf diese Weise erstellen Sie eine TXT-Datei - temp.txt. Öffnen Sie es im Editor, kopieren Sie den Text (keine Sorge, er sieht unlesbar aus) und fügen Sie ihn in Ihre .bat-Datei ein. Die Ausführung des auf diese Weise erstellten .bat im DOS-Fenster funktionierte für mich (kyrillisch, bulgarisch).
quelle
Besser sauberer: Installieren Sie einfach das verfügbare, kostenlose Microsoft Japanese Language Pack. (Andere orientalische Sprachpakete funktionieren ebenfalls, aber ich habe das japanische getestet.)
Dadurch erhalten Sie die Schriftarten mit den größeren Glyphen, machen sie zum Standardverhalten, ändern die verschiedenen Windows-Tools wie cmd, WordPad usw.
quelle
Das Ändern der Codepage in 1252 funktioniert für mich. Das Problem für mich ist, dass das Symbol Double Doller § unter Windows Server 2008 von DOS in ein anderes Symbol konvertiert wird.
Ich habe CHCP 1252 und eine Kappe davor in meiner BCP-Erklärung verwendet ^ §.
quelle
Ich habe ein ähnliches Problem umgangen, bei dem Dateien mit Unicode-Namen gelöscht wurden, indem auf sie in der Batch-Datei mit ihren kurzen Namen (8 Punkte 3) verwiesen wurde.
Die Kurznamen können dabei angezeigt werden
dir /x
. Dies funktioniert natürlich nur mit bereits bekannten Unicode-Dateinamen.quelle