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

316

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?

Vilx-
quelle
1
@JohannesDewender - Kopieren-Einfügen schief gelaufen?
Vilx
2
Python 3.6: „die Standard - Konsole auf Windows akzeptiert alle Unicode - Zeichen mit dieser Version“ (na ja, das meiste davon für mich) ABER Sie müssen die Konsole konfigurieren: Rechtsklick auf der Oberseite der Fenster (des cmd oder den Python IDLE ), wählen Sie in default / font die "Lucida-Konsole".
JinSnow
2
@ LưuVĩnhPhúc - Nein, hier geht es darum, Unicode-Befehlszeilenargumente zu übergeben, anstatt Text in der Konsole anzuzeigen. Die Konsole wird möglicherweise überhaupt nicht beteiligt.
Vilx

Antworten:

68

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:

  • CMDund "Konsole" sind nicht miteinander verbundene Faktoren. CMD.exeist nur eines von Programmen, die bereit sind, in einer Konsole zu „arbeiten“ („Konsolenanwendungen“).
  • AFAIK CMDunterstützt Unicode perfekt; Sie können alle Unicode-Zeichen eingeben / ausgeben, wenn eine Codepage aktiv ist.
  • Die Windows-Konsole bietet viel Unterstützung für Unicode - aber sie ist nicht perfekt (nur „gut genug“; siehe unten).
  • chcp 65001ist 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 mit cp65001, der Rest gilt jedoch weiterhin für Win10 .
  • Ich arbeite in cp1252. Wie ich bereits sagte: Um Unicode in eine Konsole einzugeben / auszugeben, muss man die Codepage nicht einstellen .

Die Details

  • Um Unicode in eine Konsole zu lesen / schreiben, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um nicht die File-I/OAPI, sondern die Console-I/OAPI zu verwenden. (Ein Beispiel finden Sie unter Python .)
  • Ebenso sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) zum Lesen von Unicode-Befehlszeilenargumenten intelligent genug sein, um die entsprechende API zu verwenden.
  • Das Rendern von Konsolenschriftarten unterstützt nur Unicode-Zeichen in BMP (mit anderen Worten: unten 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:

    • 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 leistungsfä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):

    • Der HEX-Eingang liefert ein Zeichen KeyUpfür Alt; Alle anderen Möglichkeiten, einen Charakter zu liefern, finden statt KeyDown. So viele Anwendungen sind nicht bereit, einen Charakter zu sehen KeyUp. (Gilt nur für Anwendungen, die Console-I/OAPI verwenden.)
    • Schlussfolgerung: Viele Anwendungen würden nicht auf HEX-Eingabeereignisse reagieren.
    • Darüber hinaus hängt das, was mit einem eingefügten Zeichen geschieht, vom aktuellen Tastaturlayout ab: Wenn das Zeichen ohne Verwendung von Präfixtasten (aber mit einer beliebigen komplizierten Kombination von Modifikatoren wie in 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.
    • Die "anderen" Zeichen werden jedoch durch Emulieren der HEX-Eingabe geliefert .

    Fazit : Wenn Ihr Tastaturlayout die Eingabe VIELER Zeichen ohne Präfixtasten nicht unterstützt, können einige fehlerhafte Anwendungen Zeichen überspringen, wenn SiePasteü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/OAPIs, 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 loslassen WinKeyund dann eingeben powershell.


(Auf der anderen Seite gibt es Programme wie ConEmuoder, ANSICONdie versuchen, mehr zu tun: Sie "versuchen", Console-I/OAPIs 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/OAPIs durchlaufen und Unicode-Befehlszeilenargumente akzeptieren. Zum Beispiel sollte jedes cygwinkompilierte Programm in Ordnung sein. Wie ich schon sagte, CMDist auch in Ordnung.

UPD: Anfangs habe cp65001ich 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.

Ilya Zakharevich
quelle
OK, für etwas so Gründliches verdienen Sie es, die akzeptierte Antwort zu sein! Genial!
Vilx
5
Ich bin ein Neuling in C ++ und kann diese Antwort nach sorgfältigem Lesen nicht verstehen. Kann mir jemand dabei helfen oder eine einfachere Erklärung geben?
Rick
@Bachi Dank Bachi habe ich herausgefunden, dass in Version 73 meines Tastaturlayouts (oben erwähnt) einige Unterstützungsdateien fehlen. Jetzt behoben! (Nach meinen .logDateien zu urteilen , ist es ein zeitweiliger Fehler in zip -ru[?!]. Ich habe keine Ahnung, wie ich es debuggen soll - oder in Zukunft vermeiden soll ...)
Ilya Zakharevich
@ Rick: Richtig! Ich habe einen Link zu einer Problemumgehung in Python hinzugefügt (aber ich kann momentan keinen direkten Link zum Patch finden…).
Ilya Zakharevich
@ IlyaZakharevich: D Danke. Aber ich gebe es irgendwie auf, Unicode unter Windows zu verwenden. Ich werde später Linux verwenden.
Rick
387

Versuchen:

chcp 65001

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

kgiannakakis
quelle
18
Wissen Sie, ob es eine Möglichkeit gibt, dies als Standard festzulegen?
AnnanFay
82
Beachten Sie, dass die Unterstützung der Windows-Codepage 65001 schwerwiegende Implementierungsfehler enthält, die viele Anwendungen beschädigen, die auf den E / A-Methoden der C-Standardbibliothek basieren. Dies ist daher sehr fragil. (Batch-Dateien funktionieren in 65001 ebenfalls nicht mehr.) Leider ist UTF-8 in Windows ein Bürger zweiter Klasse.
Bobince
7
@bobince Haben Sie ein Beispiel für einen Fehler in der Windows-Codepage 65001-Unterstützung? Ich bin neugierig, weil ich noch nie auf einen gestoßen bin und beim Googeln auch nichts aufgetaucht ist. (Batch-Dateien funktionieren natürlich nicht mehr, aber UTF-8 ist kaum ein Bürger zweiter Klasse ...)
Roman Starkov
17
@romkyns: Mein Verständnis ist, dass Aufrufe, die eine Anzahl von Bytes zurückgeben (wie z. B. fread / fwrite / etc), tatsächlich eine Anzahl von Zeichen zurückgeben. Dies führt zu einer Vielzahl von Symptomen, wie z. B. unvollständiges Lesen von Eingaben, hängen in fflush, den beschädigten Batch-Dateien und so weiter. Einige Hintergrundinformationen. Die Standard-Codepages, die für CJK-Gebietsschemas "Multibyte" verwendet werden, verfügen über eine spezielle Behandlung, um dies zu beheben, 65001 jedoch nicht - es wird nicht unterstützt .
Bobince
7
Interessante Frage hier - ist der Fehler, weil er Bytes und stattdessen Zeichen melden sollte - oder weil die Anwendungen, die ihn verwenden, Bytes = Zeichen falsch angenommen haben? Mit anderen Worten, ist es ein API-Fehler oder ein API-Verwendungsfehler?
Basic
36

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:

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

Die Batchdatei muss in CP 1250 gespeichert werden.

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

vanna
quelle
1
Prost! Ich brauchte dies, damit ich das Copyright-Zeichen in meine Batch-Datei eingeben konnte.
Lea Hayes
Dies funktionierte auch für mich in einer fast identischen Situation wie Ihre perfekt. Stattdessen enthielt mein Weg Irisch Zeichen , dh á, é, í, ó, und ú.
Seany84
@vanna, die meine "türkischen Zeichen und Leerzeichen im Pfad auf Netzwerkproblem" löst. du bist großartig.
Caglaror
2
Sie mussten wahrscheinlich nur eine andere Schriftart verwenden, um die Zeichen auch korrekt anzuzeigen. Lucida Console arbeitete für mich.
Vlastimil Ovčáčík
28

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

Ändern der Sprache für Nicht-Unicode-Programme

Maxim Yefremov
quelle
6
Dadurch wird die Unterstützung für Unicode in nicht aktiviert cmd, sondern nur die Standardcodepage umgeschaltet, für cp866die noch ein 8-Bit-Zeichensatz vorhanden ist. Es verwendet sogar cp866stattdessen, cp1251was seine eigene Scheiße an Ärger hinzufügt.
ivan_pozdeev
1
Siehe auch ich Antwort unten für neue Option in neueren Windows 10-Versionen
zvi
14

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 Processorund fügen Sie String value Autorun= hinzuchcp 65001 .

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
)

Verwenden @chcp 65001>nulstattchcp 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 ZeileSET ROOT_KEY="HKEY_CURRENT_USER" durchSET ROOT_KEY="HKEY_LOCAL_MACHINE"

Wernfried Domscheit
quelle
schöne Idee und brauchbares Beispiel auch!
13

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.

Benutzer
quelle
2
Dies ist wahrscheinlich etwas gefährlich, da es zu Namenskonflikten kommen kann. Beispiel: Wenn Sie zwei Dateien haben, die beide als "???" gerendert werden, und "cd ???" es würde nicht wissen, welche es verwenden soll (oder schlimmer noch, es würde eine beliebige wählen).
John
26
Sie geben nicht ??? ein, Sie geben den richtigen Namen ein, der nur als ??? angezeigt wird. Stellen Sie sich das als Passwort-Eingabefeld vor. Was auch immer Sie eingeben, wird als *** angezeigt, aber übermittelt wird der Originaltext.
Benutzer
Dies funktionierte tatsächlich für Befehle, die direkt an der Eingabeaufforderung ausgeführt wurden. Beim Ausführen einer .cmdBatchdatei muss ich jedoch immer noch chcp 65001den Anfang der Batchdatei setzen.
wisbucky
In Ihrem Fall handelt es sich um ein Schriftartenproblem. Der Inhalt ist vorhanden, nur keine geeignete Schriftart, um ihn anzuzeigen. Aber OP ist anders.
WesternGun
11

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:

    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 Zeichenfolgennamen 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

Stellen Sie die Standardschriftart auf "Courier New" ein:

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

Stellen Sie die Schriftgröße auf 20 ein:

    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
Alon Or. En
quelle
3
Im Allgemeinen funktioniert die Verwendung der Codepage 65001 nur ohne Fehler in Windows 10 mit dem Creators-Update. In Windows 7 gibt es sowohl Ausgabe- als auch Eingabefehler. In Windows 8 und älteren Versionen von Windows 10 gibt es nur den Eingabefehler, der die Eingabe auf 7-Bit-ASCII beschränkt.
Eryk Sun
6

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.

  1. Sie benötigen eine Schriftart mit Unicode-Unterstützung. Windows wird mit der Lucida-Konsole geliefert, die ausgewählt werden kann, indem Sie mit der rechten Maustaste auf die Titelleiste der Eingabeaufforderung klicken und auf die DefaultsOption 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 .
  2. Sie müssen die Codepage auf einstellen. Dies cp65001scheint der Versuch von Microsoft zu sein, UTF-7- und UTF-8-Unterstützung für die Eingabeaufforderung anzubieten. Führen Sie dazu die chcp 65001Eingabeaufforderung 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 at HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processorund benennen Sie ihn AutoRun. Ändern Sie den Wert in chcp 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.

Aaron3468
quelle
5

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 -> Regionale Einstellungen -> Registerkarte Verwaltung-> Systemgebietsschema ändern ...

Regionseinstellungen

zvi
quelle
Wie erreicht man dies mit Powershell oder Cmd?
Corey
Ich versuche, chinesische Schriftzeichen in der Konsole anzuzeigen, und dies funktionierte unter Windows 10 64-Bit nicht (auf Türkisch installiert und später auf Englisch geändert). Als nächstes werde ich versuchen, die chinesische Sprache zu installieren und zu prüfen, ob sie funktioniert.
Akinuri
4

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

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

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

Steve Barnes
quelle
In diesem (alten) Fall lag das Problem eher bei einem Skript als bei einer Konsole. Würde die Verwendung von Bash-Skripten dies lösen?
Vilx
Ja, in der Tat können diese Wood-Bash-Skripte als UTF-8 gekennzeichnet werden und funktionieren nur mit viel mehr Leistung als Windows-Batchdateien. Ich weiß, dass dies ein alter Fall war, dachte aber, dass es sich lohnt, diese Option für zukünftige Referenzzwecke zu kennzeichnen, da MS nicht zu sein scheint bei Unicode viel besser zu werden.
Steve Barnes
grep , find und weniger .
Peter Mortensen
Die Ausgabe von UTF-8-codierten Zeichen ist in Ordnung. Die Eingabe wird jedoch weiterhin von der Systemcodepage codiert.
Rick
1
Nur um hinzuzufügen, dass Windows-Benutzer möglicherweise bereits eine Bash-Shell haben, wenn Sie Git verwenden: Öffnen Sie einfach ein Git> Git Bash- Fenster.
Skomisa
3

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

Christoforos
quelle
7
Windws-1253 ist keine Unicode-Codepage. Es ist eine Standard-Codepage mit 256 Zeichen. Anscheinend haben Sie nur Zeichen verwendet, die auf dieser Codepage angezeigt werden können, aber es ist nicht universell.
Vilx
3

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. diroder lswenn 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 Codierung der Konsole.

Nachdem Sie die vorherigen Schritte ausgeführt haben, um den Dateiinhalt einer UTF-8-Datei mithilfe des Befehlszeilentools anzuzeigen

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

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

code4j
quelle
Das war nichts für mich. Die chinesischen Schriftzeichen in der pointBefehlsausgabe sind immer noch verstümmelt.
Ssuching Yu
@ SiqingYu Ich gebe die verrückte Einstellung auf. Verwenden Sie
code4j
Ich habe zuvor Cmder verwendet, aber es kann die von Visual Studio verwendete Entwicklerkonsole nicht ersetzen.
Ssuching Yu
@SiqingYu Meinst du die c # interaktive Powershell?
Code4j
Nicht die interaktive Power Shell, sondern die Entwicklerkonsole, die auch von Visual C ++ verwendet wird. Dies ist die Standard-Debug-Konsole in Win32 Console Application-Projekten.
Ssuching Yu
2

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.

Robert Boehne
quelle
Ahh, nein, es tut mir leid, aber Sie haben die Frage verpasst. Dies ist für den Fall, dass ich ein Programm schreibe, das die Unicode-Zeichen empfängt . Meine Frage war , die Unicode-Zeichen an ein anderes Programm zu senden (was hoffentlich den Empfang unterstützt, aber ich habe wirklich keine Möglichkeit, es zu wissen, außer der Demontage).
Vilx
2

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/TerminalAusgabe 387 dokumentiert :

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

Welche Konsolen sollten abdecken:

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

Welche Konsolen sollten NICHT abgedeckt werden:

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

Eine schnelle Entscheidung für .bat-Dateien, wenn Ihr Computer Ihren Pfad / Dateinamen korrekt anzeigt, wenn Sie ihn in das 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 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).

S. Hristov
quelle
1

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.

Mike Beckerle
quelle
1

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 ^ §.

Madhav Bitra
quelle
Danke, es funktioniert! Ich weiß nicht, warum Leute dies abgelehnt haben, es ist eine gültige Alternative für einige Leute. Diese Codepage 1252 behebt das Problem auch unter Windows Server 2012, wo der gleiche Code mit CP 65001 für mich nicht funktioniert hat. Ich nehme an, es hängt davon ab, mit welcher Codepage das Batch-Skript bearbeitet wurde oder welche Standardeinstellungen das Betriebssystem hat. In diesem Fall wurde es mit Notepad auf einem deutschen MUI-Computer mit en-US-Basisbetriebssystem erstellt.
Tony Wall
0

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.

Michael
quelle