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 ?
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").CMD
unterstützt Unicode perfekt. Sie können alle Unicode-Zeichen eingeben/ausgeben, wenn any 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 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 .cp1252
. Wie ich bereits sagte: Um Unicode in eine Konsole einzugeben/auszugeben, muss man nicht die Codepage einstellen.File-I/O
, Sondern die API Console-I/O
Verwendet. (Ein Beispiel finden Sie unter wie Python macht das .)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.]Die Standardeinstellungen in Windows sind nicht sehr hilfreich. Um die beste Erfahrung zu erzielen, sollte man 3 Konfigurationselemente einstellen:
Noch ein Gotcha mit "Einfügen" in eine Konsolenanwendung (sehr technisch):
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.)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. 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.)
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.
Versuchen:
chcp 65001
dadurch wird die Codepage in UTF-8 geändert. Außerdem müssen Sie Lucida-Konsolenschriften verwenden.
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 ...
Ü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:
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"
.
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.
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
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.
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.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.
Eine wirklich einfache Möglichkeit besteht darin, eine Windows-Bash-Shell wie MinGW zu installieren und Folgendes zu verwenden:
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.
Natürlich bekommst du auch alle üblichen * nix Goodies wie grep, find, less usw.
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 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.
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
Stellen 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 Kodierung der Konsole.
Nachdem Sie die vorherigen Schritte ausgeführt haben, können Sie den Dateiinhalt einer UTF-8-Datei mit dem Befehlszeilentool anzeigen
chcp 65001
type
, um den Dateiinhalt zu überprüfen, oder cat
, wenn Sie Ubuntu bash unter Windows 10 installiert habenDie faulste Lösung: Verwenden Sie einfach einen Konsolenemulator wie http://cmder.net/
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.
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.
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.
Eine schnelle Entscheidung für .bat-Dateien, wenn Ihr Computer Ihren Pfad/Dateinamen korrekt anzeigt, wenn Sie ihn in 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 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).
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.
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.