it-swarm.com.de

Wie verwende ich Unicode-Zeichen in der Windows-Befehlszeile?

Wir haben ein Projekt in Team Foundation Server (TFS), das einen nicht englischen Charakter (š) enthält. Beim Versuch, ein paar Build-bezogene Dinge zu skripten, sind wir auf ein Problem gestoßen - wir können den š Buchstaben nicht an die Befehlszeilen-Tools übergeben . Der Befehl Eingabeaufforderung oder was sonst bringt es durcheinander, und das Dienstprogramm tf.exe kann das angegebene Projekt nicht finden.

Ich habe verschiedene Formate für die .bat-Datei ausprobiert (ANSI, UTF-8 mit und ohne BOM ) sowie Skripte in JavaScript (das ist Unicode) von Natur aus) - aber kein Glück. Wie führe ich ein Programm aus und übergebe ihm eine Unicode-Befehlszeile ?

297
Vilx-

Mein Hintergrund: Ich verwende seit Jahren die Unicode-Eingabe/Ausgabe in einer Konsole (und mache das häufig täglich. Außerdem entwickle ich Support-Tools für genau diese Aufgabe). Es gibt nur sehr wenige Probleme, soweit Sie die folgenden Fakten/Einschränkungen verstehen:

  • CMD und "console" sind nicht miteinander verbundene Faktoren. CMD.exe Ist nur eines von Programmen, die bereit sind, in einer Konsole zu "arbeiten" ("Konsolenanwendungen").
  • AFAIK, CMD unterstützt Unicode perfekt. Sie können alle Unicode-Zeichen eingeben/ausgeben, wenn any codepage aktiv ist.
  • Die Windows-Konsole unterstützt viel Unicode, ist aber nicht perfekt (nur „gut genug“, siehe unten).
  • 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 verwendet, in der diese Problemumgehungen enthalten sind), funktioniert es nicht zuverlässig. Win8 behebt die Hälfte dieser Probleme mit cp65001, Der Rest gilt jedoch weiterhin für Win1 .
  • Ich arbeite in cp1252. Wie ich bereits sagte: Um Unicode in eine Konsole einzugeben/auszugeben, muss man nicht die Codepage einstellen.

Die Details

  • Zum Lesen/Schreiben von Unicode in eine Konsole sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) so intelligent sein, dass sie nicht die API File-I/O, Sondern die API Console-I/O Verwendet. (Ein Beispiel finden Sie unter wie Python macht das .)
  • Um Unicode-Befehlszeilenargumente lesen zu können, muss eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um die entsprechende API zu verwenden.
  • Die Darstellung von Konsolenschriftarten unterstützt nur Unicode-Zeichen in BMP= (mit anderen Worten: unter U+10000). Es wird nur die einfache Textdarstellung unterstützt (daher sollten europäische und einige ostasiatische Sprachen funktionieren) fein - soweit man vorkompositionierte Formen verwendet). [Es gibt ein geringfügiges Kleingedrucktes hier für Ostasien und für die Zeichen U + 0000, U + 0001, U + 30FB.]

Praktische Überlegungen

  • Die Standardeinstellungen in Windows sind nicht sehr hilfreich. Um die beste Erfahrung zu erzielen, sollte man 3 Konfigurationselemente einstellen:

    • Für die Ausgabe: eine umfassende Konsolenschrift. Für beste Ergebnisse empfehle ich meine Builds . (Die Installationsanweisungen sind dort vorhanden - und auch in anderen Antworten auf dieser Seite aufgeführt.)
    • Zur Eingabe: ein fähiges Tastaturlayout. Für beste Ergebnisse empfehle ich meine Layouts .
    • Für die Eingabe: HEX-Eingabe von Unicode zulassen .
  • Noch ein Gotcha mit "Einfügen" in eine Konsolenanwendung (sehr technisch):

    • HEX-Eingabe liefert ein Zeichen für KeyUp von Alt; all Die anderen Möglichkeiten, ein Zeichen zu liefern, finden auf KeyDown statt. So viele Anwendungen sind nicht bereit, ein Zeichen auf KeyUp zu sehen. (Gilt nur für Anwendungen, die die API Console-I/O Verwenden.)
    • Fazit: Viele Anwendungen würden nicht auf HEX-Eingangsereignisse reagieren.
    • Was mit einem „eingefügten“ Zeichen geschieht, hängt außerdem vom aktuellen Tastaturlayout ab: Wenn das Zeichen ohne die Verwendung von Präfixtasten eingegeben werden kann (jedoch mit einer beliebig komplizierten Kombination von Modifikatoren, wie in Ctrl-Alt-AltGr-Kana-Shift-Gray*), Wird es weitergeleitet ein emulierter Tastendruck. Dies ist, was jede Anwendung erwartet - also ist es in Ordnung, alles einzufügen, das nur solche Zeichen enthält.
    • Die "anderen" Zeichen werden jedoch durch Emulieren der HEX-Eingabe geliefert.

    Fazit: Sofern Ihr Tastaturlayout die Eingabe VIELER Zeichen ohne Präfixtasten nicht unterstützt, einige fehlerhafte Anwendungen Überspringt möglicherweise Zeichen, wenn Sie Paste über die Benutzeroberfläche der Konsole eingeben: Alt-Space E P. ( Deshalb empfehle ich die Verwendung meiner 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 diese APIs angewiesen sind, nicht. (Die Programme, die nur "File-I/O-APIs für die Dateihandles der Konsole" verwenden, funktionieren jedoch einwandfrei.)

Ein Beispiel für eine solche Nicht-Konsole ist ein Teil von Powershell von Microsoft. Ich benutze es nicht; Zum Experimentieren drücke und lasse WinKey los und gib dann powershell ein.


(Andererseits gibt es Programme wie ConEmu oder ANSICON , die versuchen, mehr zu tun: Sie "versuchen", abzufangen Console-I/O APIs, mit denen auch "echte Konsolenanwendungen" funktionieren. Dies funktioniert definitiv für Spielzeug-Beispielprogramme. Im wirklichen Leben kann dies Ihre speziellen Probleme lösen oder nicht. Experimentieren.)

Zusammenfassung

  • legen Sie die Schriftart und das Tastaturlayout fest (und erlauben Sie optional die HEX-Eingabe).

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

UPD: Anfangs habe ich für einen Fehler in cp65001 Die Kernel- und CRTL-Ebenen vertauscht ( UPD²: und Windows-Benutzermodus-API!). Also: Win8 behebt eine Hälfte dieses Fehlers; Ich habe den Abschnitt über die Anwendung "Better Console" geklärt und einen Verweis hinzugefügt, wie Python macht es.

46

Versuchen:

chcp 65001

dadurch wird die Codepage in UTF-8 geändert. Außerdem müssen Sie Lucida-Konsolenschriften verwenden.

372
kgiannakakis

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 Sonderzeichen.

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

Ändern Sie in der Batchdatei die Zeichensatzseite

Meine Batch-Datei:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

Die Batch-Datei muss im CP 1250 gespeichert werden.

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

36
vanna

Ü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:

Changing language for non-Unicode programs

25
Maxim Yefremov

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, d. H. Ihr PC bootet nicht mehr.

Die sicherste Lösung ist die folgende: Wechseln Sie zu Ihrem Registrierungsschlüssel HKEY_CURRENT_USER\Software\Microsoft\Command Processor Und fügen Sie den Zeichenfolgenwert Autorun = chcp 65001 Hinzu.

Oder Sie können dieses kleine Batch-Skript für die gängigsten Codepages verwenden.

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

Die Verwendung von @chcp 65001>nul Anstelle von chcp 65001 Unterdrückt die Ausgabe "Active Code Page: 65001", die Sie jedes Mal erhalten, 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" Durch SET ROOT_KEY="HKEY_LOCAL_MACHINE".

13

Tatsächlich besteht der Trick darin, dass die Eingabeaufforderung diese nicht englischen Zeichen tatsächlich versteht und sie nur nicht richtig anzeigt.

Wenn ich in der Eingabeaufforderung einen Pfad eingebe, der einige nicht englische Zeichen enthält, wird dieser als "?? ?????? ?????" angezeigt. Wenn Sie Ihren Befehl senden (in meinem Fall CD "??? ?????? ?????"), funktioniert alles wie erwartet.

12
User

Auf einem Windows 10 x 64-Computer habe ich den Befehl Eingabeaufforderung nicht englische Zeichen anzeigen lassen:

Ö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 für die Konsole ab, indem Sie folgende Schritte ausführen:

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

Sie sehen eine Ausgabe wie:

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *新宋体
    932    REG_SZ    *MS ゴシック

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 Stringnamen Nullen hinzufügen. In diesem Fall wäre die nächste "000":

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

Jetzt implementieren wir die UTF-8-Unterstützung:

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

Standardschrift auf "Courier New" setzen:

    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
10
Alon Or

Da ich keine vollständigen Antworten für Python 2.7 gesehen habe, werde ich die beiden wichtigen Schritte und einen optionalen Schritt skizzieren, der sehr nützlich ist.

  1. Sie benötigen eine Schriftart mit Unicode-Unterstützung. Windows wird mit der Lucida-Konsole geliefert, die durch Rechtsklicken auf die Titelleiste der Eingabeaufforderung und Klicken auf die Option Defaults ausgewählt werden kann. Dies gibt auch Zugriff auf Farben. Beachten Sie, dass Sie auch die Einstellungen für Befehlsfenster ändern können, die auf bestimmte Weise aufgerufen werden (z. B. hier öffnen, Visual Studio), indem Sie stattdessen Properties auswählen.
  2. Sie müssen die Codepage auf cp65001 Setzen. Dies scheint der Versuch von Microsoft zu sein, UTF-7- und UTF-8-Unterstützung für die Eingabeaufforderung anzubieten. Führen Sie dazu chcp 65001 In der Eingabeaufforderung aus. Einmal eingestellt, bleibt es so, bis das Fenster geschlossen wird. Sie müssen dies jedes Mal wiederholen, wenn Sie cmd.exe starten.

Eine dauerhaftere Lösung finden Sie unter diese Antwort unter Super User. Kurz gesagt, erstellen Sie einen Eintrag REG_SZ (String) mit regedit unter HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor Und nennen Sie ihn AutoRun. Ändern Sie den Wert in chcp 65001. Wenn Sie die Ausgabenachricht des Befehls nicht sehen möchten, verwenden Sie stattdessen @chcp 65001>nul.

Einige Programme haben Probleme mit der Interaktion mit dieser Codierung, wobei MinGW ein bemerkenswerter Fehler ist, der beim Kompilieren mit einer unsinnigen Fehlermeldung fehlschlägt. Dies funktioniert jedoch sehr gut und führt bei den meisten Programmen nicht zu Fehlern.

5
Aaron3468

Eine wirklich einfache Möglichkeit besteht darin, eine Windows-Bash-Shell wie MinGW zu installieren und Folgendes zu verwenden:

Enter image description here

Es gibt ein wenig Lernaufwand, da Sie die Unix-Befehlszeilenfunktionalität verwenden müssen, aber Sie werden die Leistungsfähigkeit lieben und Sie können den Konsolenzeichensatz auf UTF-8 setzen.

Enter image description here

Natürlich bekommst du auch alle üblichen * nix Goodies wie grep, find, less usw.

4
Steve Barnes

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"

Systemsteuerung -> Ländereinstellungen -> Registerkarte "Verwaltung" -> Systemgebietsschema ändern ...

Region Settings

3
zvi

Für ein ähnliches Problem (mein Problem bestand darin, UTF-8-Zeichen von MySQL an einer Eingabeaufforderung anzuzeigen),

Ich habe es so gelöst:

  1. 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.).

  2. Ich habe die Codepage auf Windows-1253 geändert. Sie tun dies auf der Eingabeaufforderung von "chcp 1253". Es hat in meinem Fall funktioniert, in dem ich UTF-8 sehen wollte.

3
Christoforos

Dieses Problem ist ziemlich ärgerlich. Ich habe normalerweise chinesische Schriftzeichen in meinem Dateinamen und in meinem Dateiinhalt. Bitte beachten Sie, dass ich Windows 10 verwende. Hier ist meine Lösung:

So zeigen Sie den Dateinamen an, z. B. dir oder ls, wenn Sie Ubuntu bash unter Windows 10 installiert haben

  1. Stellen Sie die Region so ein, dass Nicht-UTF-8-Zeichen unterstützt werden.

  2. Danach wird die Schriftart der Konsole in die Schriftart dieses Gebietsschemas geändert und auch die Kodierung der Konsole.

Nachdem Sie die vorherigen Schritte ausgeführt haben, können Sie den Dateiinhalt einer UTF-8-Datei mit dem Befehlszeilentool anzeigen

  1. Ändern Sie die Seite zu utf-8 von chcp 65001
  2. Wechseln Sie zu der Schriftart, die utf-8 unterstützt, z. B. Lucida Console
  3. Verwenden Sie den Befehl type, um den Dateiinhalt zu überprüfen, oder cat, wenn Sie Ubuntu bash unter Windows 10 installiert haben
  4. Bitte beachten Sie, dass ich nach dem Festlegen der Kodierung der Konsole auf utf-8 kein chinesisches Zeichen mit der chinesischen Eingabemethode in die Befehlszeile eingeben kann.

Die faulste Lösung: Verwenden Sie einfach einen Konsolenemulator wie http://cmder.net/

2
code4j

Besser sauberer geht es nicht: Installieren Sie einfach das kostenlose Microsoft-Sprachpaket für Japanisch. (Andere orientalische Sprachpakete werden ebenfalls funktionieren, aber ich habe das japanische getestet.)

Dies gibt Ihnen die Schriftarten mit den größeren Sätzen von Glyphen, macht sie zum Standardverhalten, ändert die verschiedenen Windows-Tools wie cmd, WordPad usw.

1
Mike Beckerle

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 partial Unicode-Unterstützung bereitgestellt.

Wie in Microsoft/Terminal Problem 387 :

Derzeit gibt es in Unicode 87.887 Ideogramme. Sie brauchen auch alle?
Wir brauchen eine Grenze, und Zeichen jenseits dieser Grenze sollten durch Font Fallback/Font Linking/Was auch immer behandelt werden.

Was Consolas abdecken sollte:

  • Zeichen, die als Symbole verwendet werden und von modernen OSS-Programmen in der CLI verwendet werden.
  • Diese Zeichen sollten dem Design und den Metriken von Consolas entsprechen und ordnungsgemäß an den vorhandenen Consolas-Zeichen ausgerichtet sein.

Was Consolas NICHT abdecken sollte:

  • Schriftzeichen und Zeichensetzung von Schriften, die über Latein, Griechisch und Kyrillisch hinausgehen, insbesondere Schriftzeichen, erfordern eine komplexe Formgebung (wie Arabisch).
  • Diese Zeichen sollten mit Schriftarten-Fallback behandelt werden.
1
VonC

Das Ändern der Codepage auf 1252 funktioniert für mich. Das Problem für mich ist, dass das Symbol Double Doller § von DOS unter Windows Server 2008 in ein anderes Symbol konvertiert wird.

Ich habe CHCP 1252 und eine Kappe davor in meiner BCP-Anweisung ^ § verwendet.

1
madhav bitra

Eine schnelle Entscheidung für .bat-Dateien, wenn Ihr Computer Ihren Pfad/Dateinamen korrekt anzeigt, wenn Sie ihn in DOS-Fenster eingeben:

  1. copy con temp.txt [Enter drücken]
  2. Geben Sie den Pfad/Dateinamen ein [drücken Sie die Eingabetaste]
  3. Drücken Sie Strg-Z [drücken Sie die Eingabetaste]

Auf diese Weise erstellen Sie eine TXT-Datei - temp.txt. Öffnen Sie es im Editor, kopieren Sie den Text (keine Sorge, er wird nicht lesbar sein) und fügen Sie ihn in Ihre .bat-Datei ein. Die Ausführung der so erstellten .bat in DOS-Fenster funktionierte für mich (kyrillisch, bulgarisch).

1
S. Hristov

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 für die Codierung in zwei Byte-Zeichenfolgen. Sie müssen diese also in Ihrem Programm vom Betriebssystem abrufen. Hierfür gibt es zwei Möglichkeiten:

1) Microsoft hat eine Erweiterung, mit der main ein breites Zeichen-Array 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 zu erhalten. 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.

1
Robert Boehne

Ich habe ein ähnliches Problem beim Löschen von Dateien mit Unicode-Namen umgangen, indem ich in der Batch-Datei auf sie mit ihren kurzen Namen (8 Punkte 3) verwiesen habe.

Die Kurznamen können mit dir /x. Dies funktioniert natürlich nur mit Unicode-Dateinamen, die bereits bekannt sind.

0
Michael