Jak używać znaków unicode w wierszu poleceń systemu Windows?

Mamy projekt w Team Foundation Server (TFS), który ma w sobie nie-Angielski znak (š). Próbując napisać kilka rzeczy związanych z kompilacją natknęliśmy się na problem - nie możemy przekazać š do narzędzi wiersza poleceń. Wiersz polecenia lub co innego go psuje, a tf.exe Narzędzie nie może znaleźć określonego projektu.

Próbowałem różnych formatów dla .plik bat (ANSI, UTF-8 z i bez BOM) oraz skryptowanie go w JavaScript (który z natury jest Unicode) - ale bez powodzenia. Jak uruchomić program i przekazać mu wiersz poleceń Unicode ?

Author: saw303, 2008-12-23

17 answers

Moje tło: używam wejścia/wyjścia Unicode w konsoli od lat (i robię to często codziennie. Ponadto opracowuję narzędzia wsparcia dla dokładnie tego zadania). Istnieje bardzo niewiele problemów, o ile rozumiesz następujące fakty/ograniczenia: {]}

  • CMD i "konsola" są czynnikami niepowiązanymi. CMD.exe jest tylko jednym z programów, które są gotowe do" pracy wewnątrz " konsoli ("aplikacje konsolowe").
  • AFAIK, CMD ma doskonałe wsparcie dla Unicode; możesz wprowadzić / wypisać wszystkie Unicode znaki, gdy Dowolna strona kodowa jest aktywna.
  • konsola Windows ma wiele wsparcia dla Unicode-ale nie jest idealna(po prostu "wystarczająco dobra"; patrz poniżej).
  • To bardzo niebezpieczne. Jeśli program nie został specjalnie zaprojektowany do obejścia błędów w jądrze systemu Windows (lub nie używa biblioteki uruchomieniowej C, która ma te obejścia), nie będzie działał niezawodnie. Win8 rozwiązuje ½ z tych problemów z cp65001, ale reszta nadal ma zastosowanie do Win10 .
  • pracuję w cp1252. Jak już mówiłem: aby wejść/wyjść Unicode w konsoli, nie trzeba ustawiać strony kodowej.

Szczegóły

  • aby odczytywać / zapisywać Unicode na konsoli, aplikacja (lub jej biblioteka uruchomieniowa C) powinna być wystarczająco inteligentna, aby używać nie File-I/O API, ale Console-I/O API. (Dla przykładu zobacz Jak to robi Python .)
  • podobnie, aby odczytać argumenty wiersza poleceń Unicode, aplikacja (lub jej biblioteka uruchomieniowa w języku C) powinna być wystarczająco inteligentna, aby używać odpowiednie API.
  • renderowanie czcionek konsoli obsługuje tylko znaki Unicode w BMP(innymi słowy: poniżej U+10000). Obsługiwane jest tylko proste renderowanie tekstu (tak więc języki europejskie - i niektóre wschodnioazjatyckie - powinny działać poprawnie - o ile używa się form prekomponowanych). [Jest drobnym drukiem tutaj dla Azji Wschodniej i dla znaków U+0000, u+0001, u+30FB.]

Rozważania praktyczne

  • Domyślne W oknie nie są bardzo pomocne. Aby uzyskać najlepsze wrażenia, należy dostroić 3 elementy konfiguracji:

    • dla wyjścia: obszerna czcionka konsoli. Aby uzyskać najlepsze rezultaty, polecam moje budowle . (Instrukcje instalacji są tam-a także wymienione w innych odpowiedziach na tej stronie.)
    • dla wejścia: sprawny układ klawiatury. Aby uzyskać najlepsze rezultaty, polecam moje layouty .
    • For input: allow hex input of Unicode .
  • Jeszcze jedno z "wklejaniem" do aplikacji konsolowej (bardzo techniczne):

    • HEX input dostarcza znak na KeyUp z Alt; wszystkie inne sposoby dostarczenia znaku zdarzają się na KeyDown; tak wiele aplikacji nie jest gotowych, aby zobaczyć znak na KeyUp. (Dotyczy tylko aplikacji korzystających z API {[7] }.)
    • wniosek: wiele aplikacji nie reagowałoby na zdarzenia szesnastkowe.
    • ponadto, co się dzieje z "wklejonym" znakiem zależy od bieżącego układu klawiatury: jeśli znak można wpisać bez użycia klawiszy prefiksowych (ale z dowolną skomplikowaną kombinacją modyfikatorów, jak w Ctrl-Alt-AltGr-Kana-Shift-Gray*), to jest on dostarczany na emulowanej klawiaturze. Tego oczekuje każda aplikacja - więc wklejanie wszystkiego, co zawiera tylko takie znaki, jest w porządku.
    • jednak "inne" znaki są dostarczane przez emulujące wejście szesnastkowe .

    wniosek : jeśli układ klawiatury nie obsługuje wprowadzania wielu znaków bez przedrostków, niektóre błędne aplikacje mogą pomijać znaki, gdy Paste za pomocą interfejsu użytkownika konsoli: Alt-Space E P. ( to dlatego polecam korzystanie z moich układów klawiatury!)

Należy również pamiętać, że "alternatywne, 'bardziej zdolne' Konsole" Dla Windows w ogóle nie są konsolami. Nie obsługują interfejsów API Console-I/O, więc programy, które polegają na tych interfejsach API do działania, nie funkcja. (Programy, które używają tylko "File-I/O API to the console filehandles", działałyby dobrze.) Jednym z przykładów takiej nie-konsoli jest część Microsoftu Powershell. Nie używam go; aby eksperymentować, Naciśnij i zwolnij WinKey, a następnie wpisz powershell.

(Z drugiej strony istnieją programy takie jak ConEmu lub ANSICON które próbują zrobić więcej: "próbują" przechwycić interfejsy API Console-I/O, aby" prawdziwe aplikacje konsolowe " również działały. To zdecydowanie działa na przykładowe programy zabawkowe; w prawdziwym życiu może to rozwiązać lub nie rozwiązać konkretnych problemów. Eksperyment.)

Podsumowanie

  • Ustaw czcionkę, układ klawiatury (i opcjonalnie Zezwalaj na wprowadzanie szesnastkowe).

  • Używaj tylko programów, które przechodzą przez API Console-I/O i akceptują argumenty linii poleceń Unicode. Na przykład, każdy cygwin-skompilowany program powinien być w porządku. Jak już mówiłem, CMD też jest w porządku.

UPD: początkowo, dla błąd w cp65001, mieszałem warstwy Kernel i CRTL. również: Win8 naprawia połowę tego błędu; wyjaśniłem sekcję o aplikacji "lepsza konsola" i dodałem odniesienie do tego, jak robi to Python.

 28
Author: Ilya Zakharevich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 03:49:53

Try:

chcp 65001

Który zmieni stronę kodową na UTF-8. Ponadto musisz użyć czcionek konsoli Lucida.

 351
Author: kgiannakakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-23 09:39:44

Miałem ten sam problem(jestem z Czech). Mam angielską instalację Windows i muszę pracować z plikami na współdzielonym dysku. Ścieżki do plików zawierają znaki specyficzne dla Czech.

Rozwiązanie, które działa dla mnie to:

W pliku wsadowym zmień stronę zestawu znaków

Mój plik wsadowy:

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

Plik wsadowy musi być zapisany w CP 1250.

Zauważ, że konsola nie wyświetla znaków poprawnie, ale je zrozumie...

 34
Author: vanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:36:23

Sprawdź język dla programów innych niż Unicode. Jeśli masz problemy z Rosyjskim w konsoli Windows, powinieneś ustawić rosyjski tutaj:

Zmiana języka dla programów innych niż Unicode

 23
Author: Maxim Yefremov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:38:44

Właściwie, sztuczka polega na tym, że wiersz polecenia rzeczywiście rozumie te nie-angielskie znaki, po prostu nie może wyświetlić ich poprawnie.

Kiedy wprowadzam ścieżkę w wierszu polecenia, która zawiera kilka Nie-angielskich znaków, jest ona wyświetlana jako "?? ?????? ?????". Po złożeniu polecenia (cd "??? ?????? ?????"w moim przypadku), wszystko działa zgodnie z oczekiwaniami.

 12
Author: User,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 13:03:27

Dość trudno jest zmienić domyślną stronę kodową konsoli Windows. Podczas wyszukiwania w internecie można znaleźć różne propozycje, jednak niektóre z nich mogą zepsuć Windows CAŁKOWICIE, tzn. komputer nie uruchamia się już.

Najbezpieczniejszym rozwiązaniem jest to: Przejdź do klucza rejestru HKEY_CURRENT_USER\Software\Microsoft\Command Processor i dodaj wartość ciągu Autorun = chcp 65001.

Lub możesz użyć tego małego skryptu wsadowego do najpopularniejszych stron kodowych.

@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
)

Użycie @chcp 65001>nul zamiast chcp 65001 tłumi wyjście "Aktywna strona kodowa: 65001" otrzymasz za każdym razem, gdy uruchomisz nowy system Windows linii poleceń.

Pełna lista wszystkich dostępnych numerów, które można uzyskać z identyfikatory strony kodowej

Uwaga, ustawienia będą dotyczyć tylko bieżącego użytkownika. Jeśli chcesz ustawić ją dla wszystkich użytkowników, zastąp linię SET ROOT_KEY="HKEY_CURRENT_USER" przez SET ROOT_KEY="HKEY_LOCAL_MACHINE"

 11
Author: Wernfried Domscheit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 09:56:07

Na komputerze z systemem Windows 10 x64 wykonałem wiersz poleceń wyświetlający Nie-angielskie znaki według:

Otwórz podwyższony wiersz polecenia (uruchom CMD.EXE jako administrator). Zapytanie rejestru o dostępne czcionki TrueType do konsoli:

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

Zobaczysz wyjście takie jak:

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

Teraz musimy dodać czcionkę TrueType, która obsługuje znaki, których potrzebujesz, jak Courier New. Robimy to, dodając zera do nazwy łańcucha, więc w tym przypadku następny będzie "000":

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

Teraz zaimplementujemy obsługę UTF-8:

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

Ustaw domyślną czcionkę na "Courier New":

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

Ustaw rozmiar czcionki na 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

Włącz szybką edycję, jeśli chcesz:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
 9
Author: Alon Or,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:51:24

Ponieważ nie widziałem żadnych pełnych odpowiedzi dla Pythona 2.7, przedstawię dwa ważne kroki i opcjonalny krok, który jest całkiem przydatny.

  1. potrzebujesz czcionki z obsługą Unicode. System Windows jest wyposażony w konsolę Lucida, którą można wybrać, klikając prawym przyciskiem myszy pasek tytułu w wierszu polecenia i klikając opcję Defaults. Daje to również dostęp do kolorów. Zauważ, że możesz również zmienić ustawienia dla okien poleceń wywoływanych w określony sposób (np. otwórz tutaj, Visual Studio) przez zamiast tego wybieramy Properties.
  2. musisz ustawić stronę kodową na cp65001, co wydaje się być próbą firmy Microsoft zaoferowania obsługi UTF-7 i UTF-8 w wierszu polecenia. Zrób to biegając chcp 65001 w wierszu polecenia . Po ustawieniu pozostaje w ten sposób, aż okno zostanie zamknięte. Musisz to powtarzać za każdym razem, gdy uruchomisz cmd.exe.

Aby uzyskać bardziej trwałe rozwiązanie, zapoznaj się zta odpowiedź NA Super User. W skrócie, Utwórz wpis REG_SZ (String) używając regedit w HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor i nazwij to AutoRun. Zmień jego wartość na chcp 65001. Jeśli nie chcesz widzieć komunikatu wyjściowego z polecenia, użyj @chcp 65001>nul.

Niektóre programy mają problemy z interakcją z tym kodowaniem, MinGW jest godnym uwagi, który zawodzi podczas kompilacji z bezsensownym Komunikatem o błędzie. Niemniej jednak działa to bardzo dobrze i nie powoduje błędów w większości programów.

 5
Author: Aaron3468,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 10:04:20

Dla podobnego problemu, (moim problemem było wyświetlanie znaków UTF-8 z MySQL w wierszu polecenia),

Rozwiązałem to tak:

  1. Zmieniłem czcionkę wiersza polecenia na konsolę Lucida. (Ten krok musi być nieistotny dla twojej sytuacji. Ma to do czynienia tylko z tym, co widzisz na ekranie, a nie z tym, co jest naprawdę charakter).

  2. Zmieniłem stronę kodową na Windows-1253. Można to zrobić w wierszu polecenia "chcp 1253". Zadziałało w mojej sprawie, gdzie Chciałem zobaczyć UTF-8.

 3
Author: Christoforos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:37:50

Jedną naprawdę prostą opcją jest zainstalowanie powłoki Windows bash, takiej jak MinGW i użycie tego:

Tutaj wpisz opis obrazka

Jest trochę krzywej uczenia się, ponieważ będziesz musiał używać funkcji wiersza poleceń Uniksa, ale pokochasz jego moc i możesz ustawić zestaw znaków konsoli na UTF-8.

Tutaj wpisz opis obrazka

Oczywiście dostajesz również wszystkie zwykłe * Nix gadżety, takie jak grep, find, less itp.

 3
Author: Steve Barnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:46:10

Ten problem jest dość irytujący. Zwykle mam Chiński znak w nazwie pliku i zawartości pliku. Proszę zauważyć, że używam systemu Windows 10, Oto moje rozwiązanie:

Aby wyświetlić nazwa pliku , na przykład dir LUB ls jeśli zainstalowałeś Ubuntu bash w systemie Windows 10

  1. Ustaw region na obsługę znaków innych niż utf 8.

  2. Następnie czcionka konsoli zostanie zmieniona na czcionkę tego ustawienia lokalnego, a także zmieni kodowanie konsoli.

Po wykonaniu poprzednich kroków, aby wyświetlić zawartość pliku pliku UTF-8 przy użyciu narzędzia wiersza poleceń

  1. zmień stronę na utf-8 przez chcp 65001
  2. Zmiana czcionki obsługującej utf-8, takiej jak Lucida Console
  3. użyj polecenia type, aby sprawdzić zawartość pliku lub cat jeśli zainstalowałeś Ubuntu bash w systemie Windows 10
  4. proszę zauważyć, że po ustawieniu kodowania konsoli na utf-8 nie mogę wpisać chińskiego znaku w cmd przy użyciu chińskiej metody wprowadzania.

Najbardziej leniwe rozwiązanie: wystarczy użyć emulatora konsoli, takiego jak http://cmder.net/

 2
Author: code4j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 09:10:59

Szybka decyzja dla .pliki bat jeśli komputer wyświetla poprawną ścieżkę / nazwę pliku podczas wpisywania go w DOS-window:

  1. copy con temp.txt [naciśnij Enter]
  2. wpisz ścieżkę / nazwę pliku [naciśnij Enter]
  3. prasa Ctrl-Z [naciśnij Enter]

W ten sposób tworzyszplik txt-temp.txt. Otwórz go w Notatniku, skopiuj tekst (nie martw się, że będzie wyglądał nieczytelnie) i wklej go do swojego .plik bat. Wykonanie .bat stworzył to sposób w DOS-window zadziałał dla mnie (Cyrylica, Bułgarski).

 1
Author: S. Hristov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-09 11:44:17

A better cleaner thing to do: just install the available, free, Microsoft Japanese language pack. (Inne pakiety języków orientalnych również będą działać, ale przetestowałem Japoński.)

To daje czcionki z większymi zestawami glifów, czyni je domyślnym zachowaniem, zmienia różne narzędzia Windows, takie jak cmd, WordPad, itp.

 1
Author: Mike Beckerle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:39:41

Zmiana strony kodowej na 1252 działa mi. Dla mnie problemem jest to, że symbol double doller konwertuje się na inny symbol przez DOS na Windows Server 2008.

Użyłem CHCP 1252 i czapki przed nim w moim oświadczeniu bcp ^§.

 1
Author: madhav bitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:44:10

Widzę tu kilka odpowiedzi, ale nie wydają się odpowiadać na pytanie-użytkownik chce uzyskać wejście Unicode z linii poleceń.

Windows używa UTF - 16 do kodowania w dwóch ciągach bajtów, więc musisz je pobrać z systemu operacyjnego w swoim programie. Można to zrobić na dwa sposoby -

1) Microsoft ma rozszerzenie, które pozwala main na pobranie szerokiej tablicy znaków: int wmain(int argc ,wchar_t * argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) wywołanie windows api, aby uzyskać wersję unicode wiersza poleceń wzar_t win_argv = (wzar_t)CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Przeczytaj to: http://utf8everywhere.org aby uzyskać szczegółowe informacje, szczególnie jeśli obsługujesz inne systemy operacyjne.

 1
Author: Robert Boehne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 14:53:20

Miałem podobny problem z usuwaniem plików o nazwie Unicode, odwołując się do nich w pliku wsadowym przez ich krótkie (8 kropka 3) nazwy.

Krótkie nazwy można przeglądać wykonując dir /x. Oczywiście działa to tylko z nazwami plików Unicode, które są już znane.

 0
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:45:06

Do utf-8: chcp 65001

Powrót do domyślnego: chcp 437

 -4
Author: pipepipe0071,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 15:09:07