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




8 Answers

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

  • CMD und "Konsole" sind unabhängige Faktoren. CMD.exe ist nur eines von Programmen, die bereit sind, in einer Konsole zu arbeiten ("Konsolenanwendungen").
  • AFAIK, CMD hat perfekte Unterstützung für Unicode; Sie können alle Unicode-Zeichen eingeben / ausgeben, wenn eine Codepage aktiv ist.
  • Windows 'Konsole hat viel Unterstützung für Unicode - aber es ist nicht perfekt (nur "gut genug"; siehe unten).
  • chcp 65001 ist sehr gefährlich. Wenn ein Programm nicht speziell dafür entworfen wurde, Defekte in der C-Laufzeitbibliothek von Microsoft zu umgehen (oder eine andere CRTL verwendet), würde es nicht zuverlässig funktionieren.
  • Ich arbeite in cp1252 . Wie ich schon sagte: Um Unicode in einer Konsole einzugeben / auszugeben, muss man die Codepage nicht setzen .

Die Details

  • Um Unicode auf einer Konsole zu lesen / schreiben, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um nicht die File-I / O-API, sondern die Konsolen-I / O-API zu verwenden.
  • Um Unicode-Befehlszeilenargumente zu lesen, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um die entsprechende API zu verwenden.
  • Console font rendering unterstützt nur Unicode-Zeichen in BMP (mit anderen Worten: unter U+10000 ). Es wird nur einfaches Text-Rendering unterstützt (daher sollten europäische - und einige ostasiatische - Sprachen funktionieren, sofern man vorkompostierte Formen verwendet). [Es gibt hier ein kleines Kleingedrucktes für Ostasien und für die Zeichen U + 0000, U + 0001, U + 30FB.]

Praktische Überlegungen

  • Die Standardeinstellungen von Windows sind nicht sehr hilfreich. Für beste Erfahrung sollte man 3 Konfigurationsstücke stimmen:

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

    • HEX-Eingabe liefert ein Zeichen auf KeyUp von Alt ; alle anderen Möglichkeiten, einen Charakter zu liefern, passieren auf KeyDown ; So viele Anwendungen sind nicht bereit, ein Zeichen in KeyUp . (Gilt nur für Anwendungen, die Console-I / O API verwenden.)
    • Fazit: Viele Anwendungen würden auf HEX-Eingabeereignisse nicht reagieren.
    • Was mit einem "Eingefügten" Zeichen passiert, hängt außerdem vom aktuellen Tastaturlayout ab: Wenn das Zeichen ohne Präfix-Tasten eingegeben werden kann (aber mit beliebig komplizierter Kombination von Modifikatoren, wie in Ctrl-Alt-AltGr-Kana-Shift-Gray* ) dann wird es auf einem emulierten Tastendruck geliefert. Dies ist, was jede Anwendung erwartet - so etwas einfügen, die nur solche Zeichen enthält, ist in Ordnung.
    • Die "anderen" Zeichen werden jedoch durch Emulieren der HEX-Eingabe geliefert.

    Fazit : Wenn Ihr Tastaturlayout die Eingabe von VIELE Zeichen ohne Präfix-Tasten unterstützt, können einige Buggy-Anwendungen Zeichen überspringen, wenn Sie über die Konsole der Konsole einfügen: Alt-Space EP . (Deshalb empfehle ich die Verwendung meiner Tastaturlayouts!)

Man sollte auch bedenken, dass die "alternativen, leistungsfähigeren" Konsolen für Windows 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-I / O-APIs zu den Konsolen-Dateihandles verwenden", funktionieren jedoch gut.)

Ein Beispiel für solche Nicht-Konsolen ist ein Teil von MicroSoft Powershell . Ich benutze es nicht; WinKey zu experimentieren, drücken und loslassen WinKey , dann geben Sie powershell .

Zusammenfassung

  • Schriftart, Tastaturlayout einstellen (und optional HEX-Eingabe erlauben).

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

meta description

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 auf ein Problem gestoßen - wir können den Buchstaben š nicht an die Kommandozeilen-Tools übergeben. Die Eingabeaufforderung oder was es 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 BOM ) sowie Scripting in JavaScript (das ist inhärent Unicode) ausprobiert - aber kein Glück. Wie führe ich ein Programm aus und gebe es an eine Unicode- Befehlszeile weiter?




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

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

Ändern Sie in der Stapeldatei die Zeichensatzseite

Meine Batchdatei:

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, aber sie wird sie verstehen ...




Tatsächlich besteht der Trick darin, dass die Eingabeaufforderung diese nicht-englischen Zeichen tatsächlich versteht, sie jedoch nicht korrekt anzeigen kann.

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




Auf einem Windows 10 x 64-Computer habe ich an der Eingabeaufforderung nicht englische Zeichen wie folgt angezeigt:

Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechten (führen Sie CMD.EXE als Administrator aus). Fragen Sie die Registry nach verfügbaren TrueType-Schriftarten ab:

    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 benötigten Zeichen wie Courier New unterstützt. Dazu fügen wir dem String-Namen Nullen hinzu. In diesem Fall wäre der nächste "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

Legen Sie die Schriftgröße auf 20 fest:

    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



Bei einem ähnlichen Problem (mein Problem war, UTF-8-Zeichen aus 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 in der Eingabeaufforderung von "Chcp 1253". Es funktionierte für meinen Fall, wo ich UTF-8 sehen wollte.




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

  1. kopiere con temp.txt [drücke Enter]
  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 in Notepad, kopieren Sie den Text (keine Sorge, er sieht unlesbar aus) und fügen Sie ihn in Ihre .bat-Datei ein. Das Ausführen der .bat, die auf diese Weise im DOS-Fenster erstellt wurde, funktionierte für mich (kyrillisch, bulgarisch).




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

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




Ich habe ein ähnliches Problem mit dem Löschen von Dateien mit Unicode-Namen durch Verweis auf sie in der Stapeldatei durch ihre kurzen (8 Punkt 3) Namen.

Die Kurznamen können mit dir /x angezeigt werden. Offensichtlich funktioniert das nur mit Unicode-Dateinamen, die bereits bekannt sind.




Related