Frage

Wir haben ein Projekt in Team Foundation Server (TFS), das einen nicht englischen Charakter (Š) enthält. Beim Versuch, ein paar buildbezogene Dinge zu skriptieren, sind wir auf ein Problem gestoßen - wir können die nicht übergeben š Brief an die Befehlszeilenwerkzeuge. Die Eingabeaufforderung oder was es sonst nicht durcheinander bringt, und die tf.exe Das Dienstprogramm kann das angegebene Projekt nicht finden.

Ich habe verschiedene Formate für die .bat-Datei ausprobiert (ANSI, UTF-8 mit und ohne Bom) und skriptt es in JavaScript (das von inhärent Unicode ist) - aber kein Glück. Wie führe ich ein Programm aus und bestehe es a Unicode Befehlszeile?

War es hilfreich?

Lösung

Mein Hintergrund: Ich verwende Unicode Input/Output jahrelang in einer Konsole (und mache es viel 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 „Konsole“ sind nicht verwandte Faktoren. CMD.exe ist nur eines der Programme, die bereit sind, in einer Konsole zu „arbeiten“ („Konsolenanwendungen“).
  • SO VIEL ICH WEISS, CMD hat perfekte Unterstützung für Unicode; Sie können alle Unicode -Zeichen eingeben/ausgeben, wenn irgendein Codepage ist aktiv.
  • Windows 'Console hat viel Unterstützung für Unicode - aber es ist nicht perfekt (nur „gut genug“; siehe unten).
  • chcp 65001 ist sehr gefährlich. Sofern ein Programm nicht speziell entwickelt wurde, um Fehler in der Windows -API zu bearbeiten (oder eine C -Laufzeitbibliothek mit diesen Problemumgehungen zu verwenden), würde es nicht zuverlässig funktionieren. Win8 behebt eine halbe dieser Probleme mit cp65001, aber der Rest gilt immer noch für den Gewinn10.
  • ich arbeite in cp1252. Wie ich bereits sagte: Um Unicode in einer Konsole einzugeben/auszugeben, muss man den Codepage nicht einstellen.

Die Details

  • Um Unicode in eine Konsole zu lesen/zu schreiben, sollte eine Anwendung (oder ihre C -Laufzeitbibliothek) klug genug sein, um nicht zu verwenden File-I/O API, aber Console-I/O API. (Zum Beispiel siehe Wie Python es macht.)
  • Um Unicode-Befehlszeilenargumente zu lesen, sollte eine Anwendung (oder ihre C-Laufzeitbibliothek) intelligent genug sein, um die entsprechende API zu verwenden.
  • Konsole -Schriftart -Rendering unterstützt nur Unicode -Zeichen in BMP (mit anderen Worten: unten U+10000). Es werden nur einfache Textrendern unterstützt (so weit europäisch - und einige ostasiatische - Sprachen sollten gut funktionieren -, soweit man vorkomponierte Formen verwendet). [Da ist ein Kleiner Kleingedruckte Hier für Ostasien und für Zeichen U+0000, u+0001, u+30fb.

Praktische Überlegungen

  • Das Standardeinstellungen im Fenster sind nicht sehr hilfreich. Für die beste Erfahrung sollte man 3 Konfigurationsstücke einstellen:

    • Für die Ausgabe: Eine umfassende Konsolenschrift. Für die besten Ergebnisse empfehle ich meine Builds. (Die Installationsanweisungen sind dort vorhanden - und auch in anderen Antworten auf dieser Seite aufgeführt.)
    • Für Eingabe: Ein fähiges Tastaturlayout. Für die besten Ergebnisse empfehle ich meine Layouts.
    • Für Eingabe: Erlauben Sie die HEX -Eingabe von Unicode.
  • Ein weiterer Gotcha mit „Einfügen“ in eine Konsolenanwendung (sehr technisch):

    • Die Hex -Eingabe liefert einen Charakter an KeyUp von Alt; alle Die anderen Möglichkeiten, einen Charakter zu liefern KeyDown; So viele Anwendungen sind nicht bereit, einen Charakter aufzusehen KeyUp. (Nur für Anwendungen verwendet Console-I/O API.)
    • Schlussfolgerung: Viele Anwendungen würden nicht auf HEX -Eingabeereignisse reagieren.
    • Darüber hinaus hängt das, was mit einem „eingefügten“ Charakter passiert Ctrl-Alt-AltGr-Kana-Shift-Gray*) dann wird es auf einem emulierten Schlüsselpress geliefert. Dies ist, was jede Anwendung erwartet - also ist das Einfügen von etwas, das nur solche Charaktere enthält.
    • Die "anderen" Charaktere werden jedoch von geliefert HEX -Eingabe emulieren.

    Fazit: Es sei denn, Ihr Tastaturlayout unterstützt die Eingabe vieler Zeichen ohne Präfix -Tasten. Einige fehlerhafte Anwendungen kann Zeichen überspringen, wenn Sie Paste über die Benutzeroberfläche der Konsole: Alt-Space E P. (Dies Warum ich empfehle, meine Tastaturlayouts zu verwenden!)

Man sollte auch bedenken, dass die „alternative, 'fähigere' Konsolen“ für Windows sind überhaupt keine Konsolen. Sie unterstützen nicht Console-I/O APIs, also würden die Programme, die auf diese APIs beruhen, nicht funktionieren. (Die Programme, die nur "Datei-i/o-APIs für die Konsolen-Dateihandles" verwenden, würden jedoch gut funktionieren.)

Ein Beispiel für eine solche Nichtkonsole ist Teil von Microsoft's Powershell. Ich benutze es nicht; experimentieren, drücken und freigeben WinKey, Geben Sie dann ein powershell.


(Andererseits gibt es Programme wie ConEmu oder ANSICON die versuchen, mehr zu tun: Sie "versuchen", abzufangen Console-I/O APIs, um auch „echte Konsolenanwendungen“ funktionieren zu lassen. Dies funktioniert definitiv für Spielzeugbeispielprogramme; Im wirklichen Leben kann dies Ihre besonderen Probleme lösen oder nicht. Experiment.)

Zusammenfassung

  • Setzen Sie die Schriftart, das Tastaturlayout (und erlauben Sie optional die HEX -Eingabe).

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

Aktualisierung: Anfangs für einen Fehler in cp65001, Ich mischte Kernel- und CRTL -Schichten (Upd²: und Windows User-Mode API!). Ebenfalls: Win8 repariert eine Hälfte dieses Fehlers; Ich habe den Abschnitt über die Anwendung „bessere Konsole“ klargestellt und einen Verweis darauf hinzugefügt, wie Python es macht.

Andere Tipps

Versuchen:

chcp 65001

Dies wird die Codeseite in UTF-8 ändern. Außerdem müssen Sie Lucida Console -Schriftarten 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 gemeinsam genutzten Laufwerk arbeiten. Die Pfade zu den Dateien enthalten tschechische Zeichen.

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

Ändern Sie in der Batch -Datei die Zeichenseite der Zeichenierung

Meine Batch -Datei:

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

Die Stapeldatei muss in CP 1250 gespeichert werden.

Beachten Sie, dass die Konsole keine Charaktere richtig anzeigt, aber sie versteht ...

Überprüfen Sie die Sprache für Nicht-Unicode-Programme. Wenn Sie Probleme mit Russisch in der Windows -Konsole haben, sollten Sie hier Russisch einstellen:

Changing language for non-Unicode programs

Es ist ziemlich schwierig, den Standard -Codepage der Windows -Konsole zu ändern. Wenn Sie das Web durchsuchen, finden Sie unterschiedliche Vorschläge. Einige von ihnen können jedoch Ihre Fenster vollständig brechen, 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 String -Wert hinzufügen Autorun = chcp 65001.

Oder Sie können dieses kleine Batch-Skript für die häufigsten Codeseiten 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
)

Verwendung @chcp 65001>nul Anstatt von chcp 65001 Unterdrückt die Ausgabe "Active Code -Seite: 65001", die Sie jedes Mal erhalten würden, wenn Sie eine neue Befehlszeile starten.

Eine vollständige Liste aller verfügbaren Nummer, aus der Sie erhalten können Code -Seitenkennungen

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 Linie SET ROOT_KEY="HKEY_CURRENT_USER" durch SET ROOT_KEY="HKEY_LOCAL_MACHINE"

Tatsächlich ist der Trick, dass die Eingabeaufforderung diese nicht englischen Zeichen tatsächlich versteht, sie einfach nicht richtig anzeigen kann.

Wenn ich einen Pfad in die Eingabeaufforderung eingehe, die einige nicht englische Chracter enthält, wird er als "??????????" angezeigt. Wenn Sie in meinem Fall Ihren Befehl einreichen (CD "?????? ?????"), funktioniert alles wie erwartet.

Auf einem Windows 10 X64-Computer habe ich die Eingabeaufforderung nicht englisch angezeigt:

Öffnen Sie eine erhöhte Eingabeaufforderung (Ausführen von CMD.exe als Administrator). Fragen Sie Ihre Registrierung für verfügbare TrueType -Schriftarten an die Konsole nach:

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

Sie werden eine Ausgabe sehen 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 Charaktere unterstützt, die Sie wie Courier neu benötigen. Wir tun dies, indem wir den Zeichenfolgennamen Nullen hinzufügen. 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 Standardschrift "Courier New":

    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 schnelle Bearbeitung, 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.

  1. Sie benötigen eine Schriftart mit Unicode -Unterstützung. Windows wird mit Lucida -Konsole geliefert, die von ausgewählt werden kann, Klicken Sie mit der rechten Maustaste auf die Titelleiste Eingabeaufforderung und Klicken auf die Defaults Möglichkeit. Dies gibt auch Zugang zu Farben. Beachten Sie, dass Sie auch Einstellungen für Befehlsfenster ändern können, die auf bestimmte Weise aufgerufen wurden (z. B. hier offen, Visual Studio), indem Sie auswählen Properties stattdessen.
  2. Sie müssen die Codeseite auf festlegen cp65001, der anscheinend Microsofts Versuch zu sein scheint, UTF-7 und UTF-8-Unterstützung für die Eingabeaufforderung anzubieten. Tun Sie dies durch Laufen chcp 65001 in der Eingabeaufforderung. Sobald es eingestellt ist, bleibt es so, bis das Fenster geschlossen ist. Sie müssen dies jedes Mal wiederholen, wenn Sie cmd.exe starten.

Für eine dauerhaftere Lösung finden Sie auf Diese Antwort auf Super -Benutzer. Kurz gesagt, erstellen Sie a REG_SZ (Zeichenfolge) Eintrag mit Regedit at HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor und nennen Sie es AutoRun. Ändern Sie den Wert davon auf chcp 65001. Wenn Sie die Ausgabenachricht nicht aus dem Befehl sehen möchten, verwenden Sie @chcp 65001>nul stattdessen.

Einige Programme haben Probleme, mit dieser Codierung zu interagieren, wobei Mingw eine bemerkenswerte ist, die beim Kompilieren mit einer unsinnigen Fehlermeldung fehlschlägt. Dies funktioniert jedoch sehr gut und verursacht bei den meisten Programmen keine Fehler.

Eine wirklich einfache Option ist die Installation einer Windows -Bash -Shell wie z. Mingw und benutze das:

Enter image description here

Es gibt eine kleine Lernkurve, da Sie die UNIX-Befehlszeilenfunktionen verwenden müssen, aber Sie werden die Kraft davon lieben und Sie können den Konsolenzeichen auf UTF-8 festlegen.

Enter image description here

Natürlich bekommen Sie auch alle üblichen *Nix -Leckereien wie Grep, Fund, Weniger usw.

Für ein ähnliches Problem (mein Problem war es, UTF-8-Zeichen von MySQL auf einer Eingabeaufforderung anzuzeigen),

Ich habe es so gelöst:

  1. Ich änderte die Schriftart der Eingabeaufforderung in Lucida Console. (Dieser Schritt muss für Ihre Situation irrelevant sein. Er muss nur mit dem tun, was Sie auf dem Bildschirm sehen und nicht mit dem, was wirklich der Charakter ist).

  2. Ich habe den Codepage in Windows-1253 geändert. Sie tun dies auf der Eingabeaufforderung von "CHCP 1253". Es funktionierte für meinen Fall, in dem ich UTF-8 sehen wollte.

Ich fand diese Methode in neuen Versionen von Windows 10 als nützlich:

Schalten Sie diese Funktion ein: "Beta: Verwenden Sie Unicode UTF-8 für die weltweite Sprachunterstützung"

Bedienfeld -> Regionale Einstellungen -> Registerkarte Administrative -> Systemgebiet ändern ...

Region Settings

This problem is quite annoying. I usually have Chinese character in my filename and file content. Please note that I am using Windows 10, here is my solution:

To display the file name, such as dir or ls if you installed Ubuntu bash on Windows 10

  1. Set the region to support non-utf 8 character.

  2. After that, console's font will be changed to the font of that locale, and it also changes the encoding of the console.

After you have done previous steps, in order to display the file content of a UTF-8 file using command line tool

  1. Change the page to utf-8 by chcp 65001
  2. Change to the font that supports utf-8, such as Lucida Console
  3. Use type command to peek the file content, or cat if you installed Ubuntu bash on Windows 10
  4. Please note that, after setting the encoding of the console to utf-8, I can't type Chinese character in the cmd using Chinese input method.

The laziest solution: Just use a console emulator such as http://cmder.net/

A quick decision for .bat files if you computer displays your path/file name correct when you typing it in DOS-window:

  1. copy con temp.txt [press Enter]
  2. Type the path/file name [press Enter]
  3. Press Ctrl-Z [press Enter]

This way you create a .txt file - temp.txt. Open it in Notepad, copy the text (don't worry it will look unreadable) and paste it in your .bat file. Executing the .bat created this way in DOS-window worked for mе (Cyrillic, Bulgarian).

A better cleaner thing to do: Just install the available, free, Microsoft Japanese language pack. (Other oriental language packs will also work, but I have tested the Japanese one.)

This gives you the fonts with the larger sets of glyphs, makes them the default behavior, changes the various Windows tools like cmd, WordPad, etc.

Changing code page to 1252 is working for me. The problem for me is the symbol double doller § is converting to another symbol by DOS on Windows Server 2008.

I have used CHCP 1252 and a cap before it in my BCP statement ^§.

I see several answers here, but they don't seem to address the question - the user wants to get Unicode input from the command line.

Windows uses UTF-16 for encoding in two byte strings, so you need to get these from the OS in your program. There are two ways to do this -

1) Microsoft has an extension that allows main to take a wide character array: int wmain(int argc, wchar_t *argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Call the windows api to get the unicode version of the command line wchar_t win_argv = (wchar_t)CommandLineToArgvW(GetCommandLineW(), &nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Read this: http://utf8everywhere.org for detailed info, particularly if you are supporting other operating systems.

Starting June 2019, with Windows 10, you won't have to change the codepage.

See "Introducing Windows Terminal" (from Kayla Cinnamon) and the Microsoft/Terminal.
Through the use of the Consolas font, partial Unicode support will be provided.

As documented in Microsoft/Terminal issue 387:

There are 87,887 ideographs currently in Unicode. You need all of them too?
We need a boundary, and characters beyond that boundary should be handled by font fallback / font linking / whatever.

What Consolas should cover:

  • Characters that used as symbols that used by modern OSS programs in CLI.
  • These characters should follow Consolas' design and metrics, and properly aligned with existing Consolas characters.

What Consolas should NOT cover:

  • Characters and punctuation of scripts that beyond Latin, Greek and Cyrillic, especially characters need complex shaping (like Arabic).
  • These characters should be handled with font fallback.

I got around a similar issue deleting Unicode-named files by referring to them in the batch file by their short (8 dot 3) names.

The short names can be viewed by doing dir /x. Obviously, this only works with Unicode file names that are already known.

To utf-8: chcp 65001

Back to default: chcp 437

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top