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 ?
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, aleConsole-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
zAlt
; wszystkie inne sposoby dostarczenia znaku zdarzają się naKeyDown
; tak wiele aplikacji nie jest gotowych, aby zobaczyć znak naKeyUp
. (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!) - HEX input dostarcza znak na
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żdycygwin
-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.
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.
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...
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:
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.
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"
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
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.
- 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 wybieramyProperties
. - 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ącchcp 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.
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:
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).
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.
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:
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.
Oczywiście dostajesz również wszystkie zwykłe * Nix gadżety, takie jak grep, find, less itp.
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
Ustaw region na obsługę znaków innych niż utf 8.
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ń
- zmień stronę na utf-8 przez
chcp 65001
- Zmiana czcionki obsługującej utf-8, takiej jak Lucida Console
- użyj polecenia
type
, aby sprawdzić zawartość pliku lubcat
jeśli zainstalowałeś Ubuntu bash w systemie Windows 10 - 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/
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:
- copy con temp.txt [naciśnij Enter]
- wpisz ścieżkę / nazwę pliku [naciśnij Enter]
- 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).
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.
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 ^§.
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.
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.
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
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