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

316

Mamy projekt w Team Foundation Server (TFS), który ma nieangielski charakter (š). Podczas próby skryptu kilka rzeczy związanych z Build-my natknęliśmy się na problem - nie możemy zdać ów list do narzędzi wiersza polecenia. Wiersz polecenia lub coś innego nie wyświetla go w porządku , a narzędzie tf.exe nie może znaleźć określonego projektu.

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

Vilx-
źródło
1
@JohannesDewender - Kopiowanie-wklejenie poszło nie tak?
Vilx
2
Python 3.6: „domyślna konsola w systemie Windows akceptuje wszystkie znaki Unicode w tej wersji” (cóż, większość dla mnie) ALE musisz skonfigurować konsolę: kliknij prawym przyciskiem myszy na górze okna (cmd lub python IDLE ), domyślnie / font wybierz „Lucida console”.
JinSnow
2
@ LưuVĩnhPhúc - Nie, chodzi o przekazywanie argumentów wiersza poleceń Unicode zamiast wyświetlania tekstu w konsoli. Konsola może się w ogóle nie włączyć.
Vilx

Odpowiedzi:

68

Moje tło: Od lat używam wejścia / wyjścia Unicode w konsoli (i robię to codziennie. Ponadto opracowuję narzędzia wsparcia dla tego zadania). Jest bardzo mało problemów, o ile rozumiesz następujące fakty / ograniczenia:

  • CMDi „konsola” są niepowiązanymi czynnikami. CMD.exeto tylko jeden z programów, które są gotowe do „pracy wewnątrz” konsoli („aplikacje konsolowe”).
  • AFAIK, CMDma doskonałą obsługę Unicode; możesz wprowadzać / wyprowadzać wszystkie znaki Unicode, gdy dowolna strona kodowa jest aktywna.
  • Konsola Windows ma DUŻO wsparcia dla Unicode - ale nie jest idealna (po prostu „wystarczająco dobra”; patrz poniżej).
  • chcp 65001jest bardzo niebezpieczny. O ile program nie został specjalnie zaprojektowany do obejścia defektów w interfejsie API systemu Windows (lub używa biblioteki wykonawczej C, która zawiera te obejścia), nie działałby niezawodnie. Win8 naprawia ½ tych problemów cp65001, ale reszta nadal dotyczy Win10 .
  • Pracuję w cp1252. Jak już powiedziałem: Aby wprowadzić / wyprowadzić Unicode w konsoli, nie trzeba ustawiać strony kodowej .

Szczegóły

  • Aby odczytać / zapisać Unicode na konsoli, aplikacja (lub jej biblioteka środowiska wykonawczego C) powinna być wystarczająco inteligentna, aby używać nie File-I/OAPI, ale Console-I/OAPI. (Na przykład zobacz, jak to robi Python ).
  • Podobnie, aby odczytać argumenty wiersza polecenia Unicode, aplikacja (lub jej biblioteka środowiska wykonawczego C) powinna być wystarczająco inteligentna, aby korzystać z odpowiedniego interfejsu API.
  • Renderowanie czcionek w konsoli obsługuje tylko znaki Unicode w BMP (innymi słowy: poniżej U+10000). Obsługiwane jest tylko proste renderowanie tekstu (więc języki europejskie - i niektóre wschodnioazjatyckie - powinny działać poprawnie - o ile używa się gotowych formularzy). [Jest tu drobny drobny druk dla Azji Wschodniej i znaków U + 0000, U + 0001, U + 30FB.]

Względy praktyczne

  • Te wartości domyślne w oknie nie są bardzo pomocne. Aby uzyskać jak najlepsze wrażenia, należy dostroić 3 elementy konfiguracji:

    • Do wydruku: obszerna czcionka konsoli. Aby uzyskać najlepsze wyniki, polecam moje kompilacje . (Instrukcje instalacji znajdują się tam - a także wymienione w innych odpowiedziach na tej stronie).
    • Do wprowadzenia: odpowiedni układ klawiatury. Aby uzyskać najlepsze wyniki, polecam moje układy .
    • Do wprowadzania: zezwól na wprowadzanie HEX w Unicode .
  • Jeszcze jedna gotcha z „Wklejaniem” do aplikacji konsoli (bardzo techniczne):

    • Wejście HEX wykonuje znak na KeyUpz Alt; wszystkie inne sposoby dostarczenia postaci mają miejsce KeyDown; tak wiele aplikacji nie jest gotowych do zobaczenia postaci KeyUp. (Dotyczy tylko aplikacji korzystających z Console-I/OAPI).
    • Wniosek: wiele aplikacji nie zareaguje na zdarzenia wejściowe HEX.
    • Co więcej, to, co dzieje się ze znakiem „Wklejony”, zależy od bieżącego układu klawiatury: jeśli znak można wpisać bez użycia klawiszy prefiksu (ale z dowolną skomplikowaną kombinacją modyfikatorów, jak w Ctrl-Alt-AltGr-Kana-Shift-Gray*), to jest on dostarczany na emulowanym naciśnięciu klawisza. Tego oczekuje każda aplikacja - więc wklejanie wszystkiego, co zawiera tylko takie znaki, jest w porządku.
    • Jednak „inne” znaki są dostarczane przez emulację danych HEX .

    Wniosek : jeśli twoja klawiatura obsługuje układ wejściowy dużo znaków bez prefiksu klucze, niektóre aplikacje buggy może pominąć znaki, kiedyPasteza pośrednictwem interfejsu konsoli:Alt-Space E P. ( To dlatego zaleca się używanie moich układów klawiatury!)

Należy również pamiętać, że „alternatywne”, „bardziej wydajne” konsole dla Windows wcale nie są konsolami . Nie obsługują Console-I/Ointerfejsów API, więc programy korzystające z tych interfejsów API nie będą działać. (Programy, które używają tylko „interfejsów API we / wy plików do uchwytów plików konsoli” działałyby jednak dobrze).

Jednym z przykładów takiej konsoli nie jest konsola MicroSoft Powershell. Nie używam tego; aby eksperymentować, naciśnij i puść WinKey, a następnie wpisz powershell.


(Z drugiej strony istnieją programy takie jak ConEmulub, ANSICONktóre starają się zrobić więcej: „próbują” przechwycić Console-I/Ointerfejsy API, aby umożliwić działanie „prawdziwych aplikacji konsolowych”. To zdecydowanie działa na przykładowe programy zabawkowe; w rzeczywistości może to lub może nie rozwiązać określonych problemów. Eksperymentuj).

Podsumowanie

  • ustaw czcionkę, układ klawiatury (i opcjonalnie zezwól na wprowadzanie HEX).

  • używaj tylko programów, które przechodzą przez Console-I/Ointerfejsy API i akceptują argumenty wiersza polecenia Unicode. Na przykład dowolny cygwinskompilowany program powinien być w porządku. Jak już powiedziałem, też CMDjest w porządku.

UPD: Początkowo, dla błędu cp65001, mieszałem warstwy jądra i CRTL ( UPD²: i interfejs API trybu użytkownika Windows!). Ponadto: Win8 naprawia połowę tego błędu; Wyjaśniłem sekcję dotyczącą aplikacji „lepszej konsoli” i dodałem odniesienie do tego, jak to robi Python.

Ilja Zacharewicz
źródło
OK, dla czegoś tak dokładnego zasługujesz na zaakceptowaną odpowiedź! Niesamowite!
Vilx
5
Jestem nowicjuszem w C ++ i nie mogę zrozumieć tej odpowiedzi po uważnym przeczytaniu. Czy ktoś może mi w tym pomóc lub ułatwić wyjaśnienie?
Rick
@ Bachi Dzięki Bachi dowiedziałem się, że w wersji 73 mojego układu klawiatury (wspomnianego powyżej) brakuje niektórych plików pomocniczych. Teraz naprawione! (Sądząc po moich .logplikach, jest to sporadyczny błąd w zip -ru[?!]. Nie mam pojęcia, jak go debugować - lub uniknąć w przyszłości ...)
Ilya Zakharevich
@ Rick: Racja! Dodałem link do obejścia w Pythonie (ale nie mogę teraz znaleźć bezpośredniego łącza do łaty…).
Ilya Zakharevich,
@IlyaZakharevich: D Dziękuję. Ale w jakiś sposób rezygnuję z używania Unicode w systemie Windows. Później będę używać Linuksa.
Rick
387

Próbować:

chcp 65001

co spowoduje zmianę strony kodowej na UTF-8. Musisz także użyć czcionek konsoli Lucida.

kgiannakakis
źródło
18
Czy wiesz, czy istnieje sposób, aby ustawić to jako domyślne?
AnnanFay,
82
Zauważ, że istnieją poważne błędy implementacyjne w obsłudze strony kodowej Windows 65001, które spowodują uszkodzenie wielu aplikacji opartych na standardowych metodach IO biblioteki C, więc jest to bardzo delikatne. (Pliki wsadowe również przestają działać w 65001.) Niestety, UTF-8 jest obywatelem drugiej kategorii w systemie Windows.
bobince
7
@ bobince Czy masz przykład błędu w obsłudze strony kodowej Windows 65001? Jestem ciekawy, ponieważ nigdy nie spotkałem żadnego z nich, a googling też niczego nie odkrył. (Pliki wsadowe oczywiście przestają działać, ale UTF-8 nie jest obywatelem drugiej kategorii ...)
Roman Starkov
17
@romkyns: Rozumiem, że wywołania zwracające liczbę bajtów (takie jak fread / fwrite / etc) faktycznie zwracają liczbę znaków. Powoduje to wiele różnych symptomów, takich jak niepełne odczytywanie danych wejściowych, zawieszanie się na fflush, uszkodzone pliki wsadowe i tak dalej. Trochę tła. Domyślne strony kodowe używane w ustawieniach „wielobajtowych” CJK mają wbudowaną specjalną obsługę, aby to naprawić, ale 65001 nie - nie jest obsługiwane .
bobince
7
Interesujące pytanie tutaj - czy błąd, ponieważ powinien zgłaszać bajty, a zamiast tego zgłaszać znaki - lub ponieważ aplikacje, które go używają, nieprawidłowo przyjęły bajty = znaki? Innymi słowy, czy jest to błąd interfejsu API, czy błąd interfejsu API?
Podstawowy
36

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

Rozwiązaniem, które działa dla mnie jest:

W pliku wsadowym zmień stronę zestawu znaków

Mój plik wsadowy:

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

Plik wsadowy należy zapisać w CP 1250.

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

Vanna
źródło
1
Twoje zdrowie! Potrzebowałem tego, aby móc wprowadzić znak praw autorskich do mojego pliku wsadowego.
Lea Hayes
Działa to również dla mnie idealnie w niemal identycznej sytuacji jak twoja. Zamiast moja droga zawarty irlandzki znaków Gaelic znaczy á, é, í, ó, i ú.
Seany84
@vanna, która rozwiązuje moje „tureckie znaki i spacje na ścieżce problemu sieciowego”. jesteś wspaniały.
caglaror,
2
Prawdopodobnie wystarczyło użyć innej czcionki, aby poprawnie wyświetlać znaki, Lucida Console działała dla mnie.
Vlastimil Ovčáčík
29

Sprawdź język dla programów nieobsługujących kodu Unicode. Jeśli masz problemy z rosyjskim w konsoli Windows, ustaw tutaj rosyjski:

Zmiana języka dla programów nieobsługujących kodu Unicode

Maksym Jefremow
źródło
6
To nie włącza obsługi Unicode cmd, przełącza tylko domyślną stronę kodową, na cp866którą wciąż jest 8-bitowy zestaw znaków. Używa nawet cp866zamiast tego cp1251dodaje swój własny kłopot.
ivan_pozdeev
1
Zobacz także moją odpowiedź poniżej, aby uzyskać nową opcję w nowszych wersjach systemu Windows 10
zvi
14

Zmiana domyślnej strony kodowej konsoli Windows jest dość trudna. Podczas wyszukiwania w Internecie można znaleźć różne propozycje, jednak niektóre z nich mogą całkowicie zepsuć system Windows, tzn. Komputer nie uruchamia się już.

Najbezpieczniejsze rozwiązanie to: Przejdź do klucza rejestru HKEY_CURRENT_USER\Software\Microsoft\Command Processori dodaj wartość ciągu Autorun= chcp 65001.

Możesz też 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>nulzamiast chcp 65001pomija dane wyjściowe „Aktywna strona kodowa: 65001”, które otrzymujesz za każdym razem, gdy uruchamiasz nowe okno wiersza poleceń.

Pełna lista wszystkich dostępnych numerów, które można uzyskać dzięki identyfikatorom stron kodowych

Uwaga: ustawienia zostaną zastosowane tylko dla bieżącego użytkownika. Jeśli chcesz ustawić go dla wszystkich użytkowników, zamień wiersz SET ROOT_KEY="HKEY_CURRENT_USER"naSET ROOT_KEY="HKEY_LOCAL_MACHINE"

Wernfried Domscheit
źródło
fajny pomysł i użyteczny przykład też!
13

W rzeczywistości sztuczka polega na tym, że wiersz polecenia faktycznie rozpoznaje te nieanglojęzyczne znaki, po prostu nie może ich poprawnie wyświetlić.

Kiedy wprowadzam ścieżkę w wierszu polecenia zawierającą niektóre znaki w języku innym niż angielski, jest ona wyświetlana jako „?? ?????? ?????”. Po przesłaniu polecenia (w moim przypadku cd „??? ?????? ?????”) wszystko działa zgodnie z oczekiwaniami.

Użytkownik
źródło
2
Jest to prawdopodobnie trochę niebezpieczne, ponieważ możesz mieć konflikt nazw. np. jeśli masz dwa pliki, które renderują się jako „???”, i wpisujesz „cd ???” nie wiedziałby, którego użyć (lub, co gorsza, wybrałby dowolny).
John
26
Nie wpisujesz ???, podajesz prawdziwe imię, które jest wyświetlane jako ???. Pomyśl o tym jak o polu wprowadzania hasła. Cokolwiek wpiszesz, jest wyświetlane jako ***, ale przesłany jest tekst oryginalny.
Użytkownik
To rzeczywiście działało w przypadku poleceń uruchamianych bezpośrednio w wierszu polecenia. Jednak po uruchomieniu .cmdpliku wsadowego nadal muszę umieścić chcp 65001na górze pliku wsadowego.
wisbucky
W twoim przypadku jest to problem z czcionką ... zawartość tam jest, po prostu brak odpowiedniej czcionki do jej wyświetlenia. Ale OP jest inny.
WesternGun
11

Na komputerze z systemem Windows 10 x64 kazałem w wierszu polecenia wyświetlać znaki w języku innym niż angielski poprzez:

Otwórz wiersz polecenia z podwyższonym poziomem uprawnień (uruchom CMD.EXE jako administrator). Zapytaj rejestr o dostępne czcionki TrueType w konsoli, wykonując następujące czynności:

    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 potrzebne znaki, takie jak Courier New. Robimy to, dodając zera do nazwy ciągu, więc w tym przypadku następnym będzie „000”:

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

Teraz wdrażamy 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
Alon Or
źródło
3
Ogólnie rzecz biorąc, użycie strony kodowej 65001 będzie działać tylko bez błędów w systemie Windows 10 z aktualizacją dla twórców. W Windows 7 będzie miał zarówno błędy wyjściowe, jak i wejściowe. W Windows 8 i starszych wersjach Windows 10 ma tylko błąd wejściowy, który ogranicza wprowadzanie do 7-bitowego ASCII.
Eryk Sun,
6

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

  1. Potrzebujesz czcionki z obsługą Unicode. System Windows jest dostarczany z konsolą Lucida, którą można wybrać, klikając prawym przyciskiem myszy pasek tytułu wiersza polecenia i klikając Defaultsopcję. Daje to również dostęp do kolorów. Pamiętaj, że możesz również zmienić ustawienia okien poleceń wywoływanych w określony sposób (np. Otwórz tutaj, Visual Studio), wybierając Propertieszamiast tego.
  2. Musisz ustawić stronę kodową na cp65001, która wydaje się być próbą Microsoftu oferowania UTF-7 i UTF-8 wsparcia dla wiersza poleceń. Zrób to, uruchamiając chcp 65001w wierszu polecenia . Po ustawieniu pozostaje tak do momentu zamknięcia okna. Musisz to zrobić ponownie przy każdym uruchomieniu cmd.exe.

Aby uzyskać bardziej trwałe rozwiązanie, zapoznaj się z odpowiedzią na temat Super User. Krótko mówiąc, utwórz REG_SZwpis (String) za pomocą regedit at HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processori nazwij go AutoRun. Zmień jego wartość na chcp 65001. Jeśli nie chcesz widzieć komunikatu wyjściowego z polecenia, użyj @chcp 65001>nulzamiast niego.

Niektóre programy mają problemy z interakcją z tym kodowaniem, MinGW jest godnym uwagi programem, 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.

Aaron3468
źródło
5

Uważam tę metodę za przydatną w nowych wersjach systemu Windows 10:

Włącz tę funkcję: „Beta: użyj Unicode UTF-8 do obsługi języków na całym świecie”

Panel sterowania -> Ustawienia regionalne -> karta Administracja -> Zmień ustawienia regionalne systemu ...

Ustawienia regionu

zvi
źródło
Jak to osiągnąć za pomocą programu PowerShell lub cmd?
Corey,
Próbuję wyświetlić chińskie znaki w konsoli i nie działało to w systemie Windows 10 64-bit (zainstalowany w języku tureckim, a później zmieniony na angielski). Następnie spróbuję zainstalować język chiński i zobaczę, czy działa.
akinuri
4

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

Wpisz opis zdjęcia tutaj

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

Wpisz opis zdjęcia tutaj

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

Steve Barnes
źródło
W tym (starym) przypadku problemem był skrypt, a nie konsola. Czy rozwiązanie skryptów bash rozwiązałoby ten problem?
Vilx
Tak, rzeczywiście, ich skrypty bashowe mogą być oflagowane jako UTF-8 i po prostu działają z dużo większą mocą niż pliki wsadowe systemu Windows - wiem, że to był stary przypadek, ale myślałem, że opcja była warta oflagowania na przyszłość, ponieważ MS nie wydaje się być coraz lepszym w Unicode.
Steve Barnes
grep , znajdź i mniej .
Peter Mortensen
Wyprowadzanie znaków zakodowanych w UTF-8 jest w porządku. Ale dane wejściowe są nadal kodowane przez systemową stronę kodową.
Rick
1
Aby dodać, że użytkownicy Windows mogą już mieć powłokę bash, jeśli używasz Git: po prostu otwórz okno Git> Git Bash .
skomisa
3

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

Rozwiązałem to w ten sposób:

  1. Zmieniłem czcionkę wiersza polecenia na Lucida Console. (Ten krok musi być nieistotny dla twojej sytuacji. Ma on związek tylko z tym, co widzisz na ekranie, a nie z tym, co naprawdę jest postacią).

  2. Zmieniłem stronę kodową na Windows-1253. Robisz to w wierszu polecenia, „chcp 1253”. Sprawdziło się w moim przypadku, w którym chciałem zobaczyć UTF-8.

Christoforos
źródło
7
Windws-1253 nie jest stroną kodową Unicode. To standardowa 256-znakowa strona kodowa. Najwyraźniej użyłeś tylko znaków, które mogą być wyświetlane na tej stronie kodowej, ale nie będzie to uniwersalne.
Vilx
3

Ten problem jest dość denerwujący. Zwykle w nazwie pliku i treści pliku mam chiński znak. Pamiętaj, że korzystam z systemu Windows 10, oto moje rozwiązanie:

Aby wyświetlić nazwę pliku , na przykład dirlub lsjeśli zainstalowałeś Ubuntu bash na Windows 10

  1. Ustaw region tak, aby obsługiwał znak inny niż utf 8.

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

Po wykonaniu poprzednich kroków, aby wyświetlić zawartość pliku UTF-8 za pomocą narzędzia wiersza polecenia

  1. Zmień stronę na utf-8 przez chcp 65001
  2. Zmień czcionkę obsługującą utf-8, taką jak Lucida Console
  3. Użyj typepolecenia, aby zajrzeć do zawartości pliku lub catjeśli zainstalowałeś Ubuntu bash na Windows 10
  4. Zauważ, ż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/

code4j
źródło
To nie dla mnie. Chińskie znaki na wyjściu pointpolecenia są nadal zniekształcone.
Ssuching Yu
@SiqingYu Porzucam szalone ustawienie. Wystarczy użyć blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx
code4j
Używałam wcześniej Cmdera, ale nie może on zastąpić konsoli programisty używanej przez Visual Studio.
Ssuching Yu
@SiqingYu Czy masz na myśli interaktywny PowerShell c #?
code4j
Nie interaktywna powłoka zasilania, ale konsola programisty, również używana przez Visual C ++. Jest to domyślna konsola debugowania w projektach aplikacji konsoli Win32.
Ssuching Yu
2

Widzę tu kilka odpowiedzi, ale wydaje się, że nie odpowiadają na pytanie - użytkownik chce uzyskać dane wejściowe Unicode z wiersza poleceń.

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

1) Microsoft ma rozszerzenie, które pozwala main przyjmować szeroką tablicę znaków: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Wywołaj interfejs Windows, aby uzyskać wersję Unicode wiersza poleceń wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW () i & 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 wspierasz inne systemy operacyjne.

Robert Boehne
źródło
Ach, nie, przepraszam, ale przegapiłeś pytanie. Dzieje się tak, gdy piszę program, który odbierze znaki Unicode. Moje pytanie dotyczyło wysłania znaków Unicode do innego programu (który, mam nadzieję, obsługuje ich otrzymywanie, ale tak naprawdę nie mam żadnej wiedzy poza deasemblacją).
Vilx-
2

Od czerwca 2019 r. W systemie Windows 10 nie będziesz musiał zmieniać strony kodowej.

Zobacz „ Przedstawiamy Windows Terminal ” (od Kayla Cinnamon ) i Microsoft / Terminal .
Dzięki zastosowaniu czcionki Consolas zapewniona będzie częściowa obsługa Unicode.

Jak udokumentowano w Microsoft/Terminalnumerze 387 :

Obecnie w Unicode znajduje się 87 887 ideogramów. Potrzebujesz ich wszystkich?
Potrzebujemy granicy, a znaki przekraczające tę granicę powinny być obsługiwane przez cofanie się czcionek / łączenie czcionek / cokolwiek innego.

Jakie konsole powinny obejmować:

  • Znaki używane jako symbole używane przez współczesne programy OSS w CLI.
  • Znaki te powinny być zgodne z projektem i danymi Consolas oraz odpowiednio dopasowane do istniejących znaków Consolas.

Czego konsole NIE powinny obejmować:

  • Znaki i interpunkcja skryptów, które poza łacińskim, greckim i cyrylicy, szczególnie znaki wymagają złożonego kształtowania (jak arabski).
  • Znaki te powinny być obsługiwane przez zastępowanie czcionek.
VonC
źródło
1

Szybka decyzja dla plików .bat, jeśli komputer wyświetla poprawną ścieżkę / nazwę pliku podczas pisania w oknie DOS:

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

W ten sposób tworzysz plik .txt - temp.txt. Otwórz go w Notatniku, skopiuj tekst (nie martw się, będzie wyglądał nieczytelnie) i wklej go do pliku .bat. Wykonanie .bat utworzonego w ten sposób w DOS-window działało dla mnie (cyrylica, bułgarski).

S. Hristov
źródło
1

Lepsza czystsza rzecz: po prostu zainstaluj dostępny, bezpłatny pakiet językowy Microsoft japoński. (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, sprawia, że ​​są domyślnym zachowaniem, zmienia różne narzędzia Windows, takie jak cmd, WordPad itp.

Mike Beckerle
źródło
1

Zmiana strony kodowej na 1252 działa dla mnie. Problemem jest dla mnie to, że symbol podwójnej lalki § jest konwertowany na inny symbol przez DOS w systemie Windows Server 2008.

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

madhav bitra
źródło
Dzięki, działa! Nie wiem, dlaczego ludzie to głosowali, jest to ważna alternatywa dla niektórych osób. Ta strona kodowa 1252 rozwiązuje problem również w systemie Windows Server 2012, w którym ten sam kod z CP 65001 nie działał dla mnie. Podejrzewam, że zależy to od tego, na jakiej stronie kodowej edytowany był skrypt wsadowy lub od ustawień domyślnych systemu operacyjnego. W tym przypadku został on utworzony za pomocą Notatnika na niemieckiej maszynie MUI z podstawowym systemem operacyjnym w USA.
Tony Wall
0

Rozwiązałem podobny problem polegający na usuwaniu plików o nazwie Unicode, odwołując się do nich w pliku wsadowym ich krótkimi nazwami (8 kropek 3).

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.

Michał
źródło