Как использовать символы юникода в командной строке Windows?

У нас есть проект в Team Foundation Server (TFS), в котором используется не английский символ (š). При попытке написать сценарий для некоторых вещей, связанных со сборкой, мы столкнулись с проблемой - мы не можем передать букву š инструментам командной строки. Командная строка или что-то еще портит ее, и утилита tf.exe не может найти указанный проект.

Я пробовал разные форматы для файла .bat (ANSI, UTF-8 с BOM и без него) ), а также сценарии на JavaScript (который по своей сути является Unicode) - но не повезло. Как выполнить программу и передать ей командную строку Unicode?


person Vilx-    schedule 23.12.2008    source источник
comment
@JohannesDewender - Копирование и вставка пошли не так?   -  person Vilx-    schedule 19.12.2012
comment
Python 3.6: консоль по умолчанию в Windows принимает все символы Unicode с этой версией (ну, большинство из них для меня) НО вам нужно настроить консоль: щелкните правой кнопкой мыши в верхней части окон ( cmd или python IDLE), в default / font выберите консоль Lucida.   -  person JinSnow    schedule 13.01.2017
comment
@ LưuVĩnhPhúc - Нет, речь идет о передаче аргументов командной строки Unicode, а не отображении текста в консоли. Консоль может вообще не вмешиваться.   -  person Vilx-    schedule 28.05.2017


Ответы (18)


Мой опыт: я использую ввод / вывод Unicode в консоли в течение многих лет (и часто делаю это ежедневно. Более того, я разрабатываю инструменты поддержки именно для этой задачи). Насколько вы понимаете следующие факты / ограничения, проблем очень мало:

  • CMD и «консоль» не связаны между собой. CMD.exe - это всего лишь одна из программ, которые готовы «работать внутри» консоли («консольные приложения»).
  • AFAIK, CMD имеет прекрасную поддержку Unicode; вы можете вводить / выводить все символы Unicode, когда активна любая кодовая страница.
  • Консоль Windows имеет БОЛЬШУЮ поддержку Unicode, но она не идеальна (просто «достаточно хорошо»; см. Ниже).
  • chcp 65001 очень опасно. Если программа не была специально разработана для обхода дефектов в API Windows (или не использует библиотеку времени выполнения C, в которой есть эти обходные пути), она не будет работать надежно. Win8 устраняет ½ из этих проблем с cp65001, но остальное по-прежнему применимо к Win10.
  • Я работаю в cp1252. Как я уже сказал: Для ввода / вывода Unicode в консоли не нужно устанавливать кодовую страницу.

Детали

  • Чтобы читать / записывать Unicode в консоль, приложение (или его библиотека времени выполнения C) должно быть достаточно умным, чтобы использовать не File-I/O API, а Console-I/O API. (Например, см. как это делает Python.)
  • Точно так же, чтобы читать аргументы командной строки Unicode, приложение (или его библиотека времени выполнения C) должно быть достаточно умным, чтобы использовать соответствующий API.
  • Визуализация шрифтов консоли поддерживает только символы Unicode в BMP (другими словами: ниже U+10000). Поддерживается только простой рендеринг текста (поэтому европейские и некоторые восточноазиатские языки должны работать нормально, если используются предварительно составленные формы). [Здесь есть второстепенный мелкий шрифт для восточноазиатских языков и для символов U + 0000, U + 0001, U + 30FB. ]

Практические соображения

  • Значения по умолчанию в окне не очень полезны. Для наилучшего восприятия необходимо настроить 3 части конфигурации:

    • For output: a comprehensive console font. For best results, I recommend my builds. (The installation instructions are present there — and also listed in other answers on this page.)
    • Для ввода: подходящая раскладка клавиатуры. Для достижения наилучших результатов я рекомендую мои макеты.
    • Для ввода: разрешить HEX-ввод Юникод.
  • Еще одна проблема с «вставкой» в консольное приложение (очень техническая):

    • HEX input delivers a character on KeyUp of Alt; all the other ways to deliver a character happen on KeyDown; so many applications are not ready to see a character on KeyUp. (Only applicable to applications using Console-I/O API.)
    • Вывод: многие приложения не будут реагировать на события ввода HEX.
    • Более того, то, что происходит с «вставленным» символом, зависит от текущей раскладки клавиатуры: если символ может быть набран без использования префиксных клавиш (но с произвольной сложной комбинацией модификаторов, как в Ctrl-Alt-AltGr-Kana-Shift-Gray*), то он доставляется при эмулированном нажатии клавиши. Это то, чего ожидает любое приложение, поэтому вставка всего, что содержит только такие символы, - это нормально.
    • Однако «другие» символы передаются посредством имитации ввода HEX.

    Заключение: если ваша раскладка клавиатуры не поддерживает ввод МНОГО символов без префиксных клавиш, некоторые приложения с ошибками могут пропускать символы, когда вы Paste через пользовательский интерфейс консоли. : Alt-Space E P. (Вот почему я рекомендую использовать свою раскладку клавиатуры!)

Также следует иметь в виду, что «альтернативные,« более функциональные »консоли» для Windows вообще не являются консолями. Они не поддерживают Console-I/O API, поэтому программы, которые полагаются на работу этих API, не будут работать. (Программы, которые используют только «API файлового ввода-вывода для файловых дескрипторов консоли», тем не менее, будут работать нормально.)

Одним из примеров такой неконсоли является часть Powershell от MicroSoft. Я им не пользуюсь; чтобы поэкспериментировать, нажмите и отпустите WinKey, затем введите powershell.


(С другой стороны, существуют такие программы, как ConEmu или _ 23_, которые пытаются сделать больше: они« пытаются »перехватить Console-I/O API, чтобы« настоящие консольные приложения »тоже работали. Это определенно работает для игрушек. примеры программ; в реальной жизни это может решить ваши проблемы, а может и не решить. Экспериментируйте.)

Резюме

  • установить шрифт, раскладку клавиатуры (и, при желании, разрешить ввод HEX).

  • используйте только программы, которые проходят через Console-I/O API и принимают аргументы командной строки Unicode. Например, подойдет любая cygwin-скомпилированная программа. Как я уже сказал, CMD тоже в порядке.

UPD: Изначально из-за ошибки в cp65001 я смешивал уровни ядра и CRTL (UPD²: и API пользовательского режима Windows!). Также: Win8 исправляет половину этой ошибки; Я разъяснил раздел о «улучшенном консольном» приложении и добавил ссылку на то, как это делает Python.

person Ilya Zakharevich    schedule 16.12.2017
comment
Хорошо, за что-то такое вы заслуживаете принятого ответа! Потрясающие! - person Vilx-; 16.12.2017
comment
Я новичок в C ++ и не могу понять этот ответ после внимательного прочтения. Может ли кто-нибудь помочь мне в этом или дать более простое объяснение? - person Rick; 06.06.2018
comment
@Bachi Благодаря Bachi я обнаружил, что в v73 моей раскладки клавиатуры (упомянутой выше) не хватает некоторых файлов поддержки. Теперь исправлено! (Судя по моим .log файлам, это периодически возникающая ошибка в zip -ru [?!]. Не знаю, как отладить ее - или избежать в будущем…) - person Ilya Zakharevich; 20.09.2018
comment
@ Рик: Верно! Я добавил ссылку на обходной путь в Python (но сейчас я не могу найти прямую ссылку на патч…). - person Ilya Zakharevich; 20.09.2018
comment
@IlyaZakharevich: D Спасибо. Но я как-то отказываюсь от использования юникода в Windows. Я собираюсь использовать Linux позже. - person Rick; 20.09.2018
comment
Багов в консоли нет в ядре. API-интерфейсы в kernel32.dll и kernelbase.dll обычно взаимодействуют с системными вызовами, экспортируемыми ntdll.dll. Консольный API в конечном итоге выполняет либо вызовы ввода-вывода (например, NtReadFile, NtDeviceIoControlFile) в Windows 8+, либо вызовы LPC в более старых версиях. Эти системные вызовы проходят через ядро ​​(например, через устройство ConDrv в Win 8+), но в конечном итоге они реализуются в хост-процессе консоли пользовательского режима. Это либо экземпляр conhost.exe в Windows 7+, либо, в более старых версиях, процесс подсистемы сеанса csrss.exe. Ошибки консоли обычно здесь. - person Eryk Sun; 20.09.2018
comment
Похоже, настоящая поддержка UTF-8 (уровня Unix) в консолях Windows находится в стадии реализации: github .com / Microsoft / console / issues / 190 и github.com/Microsoft/WSL. / issues / 75. - person vulcan raven; 16.12.2018
comment
cmd Windows 10 поддерживает UTF-8 намного лучше, чем предыдущие версии Командная строка Windows: текстовый буфер вывода Unicode и UTF-8 - person phuclv; 20.02.2019
comment
@phuclv: они утверждают, что они это делают, но я не видел ни одного примера того, что было бы лучше, чем то, что есть на Win7. Более того, IIUC, это появится в какой-то момент - в прошлый раз, когда я проверял, казалось, что их изменения не были доступны извне ядра. (Итак: IIUC, нужно было бы открыть дескриптор определенного драйвера - это не «просто запись в STDOUT». Я могу ошибаться - но сложно извлечь технические детали из всей создаваемой ими флешки). - person Ilya Zakharevich; 21.02.2019
comment
более функциональные консоли теперь могут быть настоящими консолями с помощью API псевдоконсоли. Microsoft теперь выпускает официальную более функциональную консоль, Windows Terminal. - person user31708; 13.06.2020
comment
При изменении шрифта на DejaVu Sans Mono Unifont в CMD отображаются неработающие символы корейского и китайского языков, а Unifont недоступен для CMD, когда он работает в Microsoft Word. - person PHD; 20.09.2020
comment
Вы должны быть более конкретными в своих жалобах. (Особенно в вашем «Unifont не доступен для CMD».) Я могу только догадываться, что вы имеете в виду, что вариант «Mono» включает только те символы, которые имеют смысл в соотношении сторон 3: 2. (У меня есть планы сделать еще один вариант, «в любом случае включая оставшихся персонажей», но я не мог найти время, чтобы поработать над этим в течение последних двух лет.) - person Ilya Zakharevich; 05.10.2020

Пытаться:

chcp 65001

который изменит кодовую страницу на UTF-8. Также вам необходимо использовать консольные шрифты Lucida.

person kgiannakakis    schedule 23.12.2008
comment
Вы знаете, есть ли способ сделать это по умолчанию? - person AnnanFay; 14.11.2011
comment
Мною шрифт Lucida остается выбранным, но chcp нужно набирать каждый раз ... в любом случае большое спасибо за этот совет, я даже не думал, что это возможно :) - person Danubian Sailor; 21.11.2011
comment
Обратите внимание, что в поддержке кодовой страницы 65001 Windows есть серьезные ошибки реализации, которые нарушат работу многих приложений, которые полагаются на методы ввода-вывода стандартной библиотеки C, так что это очень хрупко. (Пакетные файлы также просто перестают работать в 65001.) К сожалению, UTF-8 - второсортный гражданин в Windows. - person bobince; 30.12.2011
comment
Проголосовал за всех и принял этот ответ, потому что он получил наибольшее количество голосов. Мы отказались от TFS вскоре после публикации этого вопроса, поэтому он больше не актуален. Я также не могу сказать, работает это или нет, потому что у нас больше нет сервера TFS для тестирования. - person Vilx-; 28.01.2012
comment
@bobince У вас есть пример ошибки в поддержке кодовой страницы 65001 в Windows? Мне любопытно, потому что я никогда не встречал ни одного, и поиск в Google тоже ничего не дал. (Пакетные файлы, конечно, перестают работать, но UTF-8 вряд ли является второсортным ...) - person Roman Starkov; 03.12.2012
comment
@romkyns: Насколько я понимаю, вызовы, возвращающие количество байтов (например, fread / fwrite / и т. д.), на самом деле возвращают количество символов. Это вызывает множество симптомов, таких как неполное чтение ввода, зависания в fflush, битые командные файлы и т. Д. Немного предыстории. Кодовые страницы по умолчанию, используемые для многобайтовых локалей CJK, имеют специальную встроенную обработку, чтобы исправить это, но 65001 этого не делает - это не поддерживается. - person bobince; 04.12.2012
comment
@bobince а, спасибо, это было интересно. Также нашел это, в котором есть дополнительная информация о статусе ошибки ... - person Roman Starkov; 04.12.2012
comment
@romkyns: ага! Спасибо, я знал, что читал об этом больше в блоге Каплана, но не мог выкопать пост. Удивительно, как долго это длилось без исправления (или даже без адекватной документации). - person bobince; 05.12.2012
comment
@romkyns, и хотя я опаздываю, вот ошибка с Python 3.3.2 в Windows XP и консоли с chcp 65001 и Lucida Console: просто создайте строку s с символами от 945 до 969 (это греческий алфавит). Затем просто попробуйте показать s (даже не вызывая print). Он напечатан на трех строках, с s на первой, мусором и двумя другими. - person ; 31.07.2013
comment
Интересный вопрос здесь - это ошибка, потому что он должен сообщать байты, а вместо этого сообщает символы, или потому, что приложения, использующие его, неправильно приняли символы bytes =? Другими словами, это сбой API или сбой использования API? - person Basic; 27.11.2013
comment
Обновленный блог Kaplan о сломанном UTF-8 в Windows доступен здесь, поскольку Microsoft удалила все его сообщения в блоге после того, как он неправильно истолковал начальство. - person alexchandel; 11.09.2015
comment
У меня не работает с еврейскими символами в Windows 10 (консоль Lucida + chcp 65001), - person Ohad Schneider; 26.12.2016
comment
Лучше используйте шрифт Consolas. В Lucida Console отсутствуют символы Юникода, например 02B9. - person asmaier; 15.01.2017
comment
Чтобы сделать utf-8 кодировкой по умолчанию: перейдите к [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun] и установите для него chcp 65001 - person maviz; 05.03.2017
comment
Поддержка консоли (conhost.exe) кодовой страницы 65001 в корне нарушена (как для ввода, так и для вывода в Windows 7, но все еще не работает для ввода в Windows 10). Пожалуйста, удалите это предложение, чтобы не повторять этот плохой совет в бесконечном цикле наивной «помощи». Оболочка cmd - это приложение Unicode, которое использует консольный интерфейс UTF-16 API и базовые API CreateProcessW и ShellExecuteExW. Если есть проблема с обработкой командной строки, это потому, что приложение использует кодированную ANSI версию char * из стандартного C main вместо wchar_t * из wmain точки входа. - person Eryk Sun; 05.03.2017
comment
Из-за плохой поддержки вам лучше использовать альтернативные консоли, если вам нужен надежный Unicode. Как Console2 для программ Windows и mintty для программ Cygwin (именно поэтому они в первую очередь выпустили mintty). - person ivan_pozdeev; 28.10.2017
comment
@eryksun как насчет шрифта? У меня сложилось впечатление, что cmd в основном использует для отображения 8-битные точки символов, поэтому он не может поддерживать более 256 одновременно. - person ivan_pozdeev; 28.10.2017
comment
@ivan_pozdeev, CMD - это стандартная оболочка ввода-вывода, а не консоль или терминал. Для дескрипторов консоли он использует консольные функции Unicode ReadConsoleW и WriteConsoleW, которые считывают и записывают текст UTF-16 из и в связанный с ним хост-процесс консоли, conhost.exe. Если дескриптор файла не является консолью (например, чтение пакетного файла или чтение конвейерного ввода из цикла for /f или перенаправление dir на конвейер), встроенные команды CMD используют кодовую страницу ввода или вывода консоли в качестве кодировки. Для вывода вы можете переопределить это на UTF-16 с помощью опции CMD /u. - person Eryk Sun; 28.10.2017
comment
@ivan_pozdeev, в консоли используются 16-битные символьные ячейки. В принципе, он может отображать любой символ в BMP. Однако он не использует Uniscribe / DirectWrite, поэтому не поддерживает сложные сценарии (например, текст с письмом справа налево) или автоматические резервные шрифты. Ручное связывание шрифтов в реестре возможно, но результаты не очень хорошие, поэтому на практике это ограничивается тем, что поддерживает текущий шрифт. Символ за пределами BMP записывается как суррогатная пара UTF-16 в двух логически отдельных ячейках, поэтому он отображается как два глифа по умолчанию (например, пустые поля), но его можно скопировать в буфер обмена. - person Eryk Sun; 28.10.2017
comment
–1 UTF-8 в консолях работает только частично и только для вывода. Кроме того, вопрос не в вводе-выводе, а в аргументах командной строки. На данный момент более 300 некомпетентных специалистов поддержали этот совет. Это поразительно. - person Cheers and hth. - Alf; 04.11.2017
comment
@ Cheersandhth.-Alf, заголовок довольно общий, я предполагаю, что именно поэтому многие поисковые системы сначала попадают на эту страницу. Однако, помимо несомненного ограничения / ошибки, я думаю, что chcp 65001 достаточно для 99% людей, имеющих проблемы с Unicode в командной строке. - person Wernfried Domscheit; 06.02.2018
comment
@WernfriedDomscheit: Какая первая часть «UTF-8 в консолях работает только частично и только для вывода», которую вы не смогли понять? - person Cheers and hth. - Alf; 06.02.2018
comment
@ Cheersandhth.-Альф, я понимаю суть проблемы. Однако для типичного сценария использования, например echo € > euro.txt и type euro.txt решения достаточно для большинства людей. Такие команды не работают с кодовой страницей 850 (значение по умолчанию для Западной Европы). - person Wernfried Domscheit; 06.02.2018
comment
решение достаточно для большинства людей Это не решение. Это совет сродни засыпке сахара в бензобак машины, банальному саботажу. А что касается того, что я понимаю, то нет, вы не понимаете. Учитывая это утверждение, я советую прочитать об эффекте Даннинга-Крюгера. - person Cheers and hth. - Alf; 06.02.2018
comment
@ Cheers и hth. - Альф: Почти 300 тысяч человек пришли к этому вопросу из-за названия. Подавляющее большинство не прочитали основной вопрос. Они сразу же скопировали и вставили код из первого ответа, это сработало для них, проголосовало и продолжило свою жизнь. Скорее всего, им больше не придется иметь дело с тонкостями командной строки Windows. Они просто хотели запустить простую программу и продолжить свою работу. Им не нужен глубокий опыт, которым вы, очевидно, обладаете, и они не некомпетентны. Не нужно быть грубым. - person kgiannakakis; 07.02.2018
comment
@OhadSchneider версия Windows ‹= 1709 не может использовать chcp, и я тоже потерпел неудачу. - person Rick; 06.06.2018

У меня была такая же проблема (я из Чехии). У меня английская версия Windows, и мне приходится работать с файлами на общем диске. Пути к файлам включают символы, специфичные для чешского языка.

Решение, которое работает для меня:

В пакетном файле измените страницу кодировки

Мой командный файл:

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

Пакетный файл необходимо сохранить в CP 1250.

Обратите внимание, что консоль не будет правильно отображать символы, но она их поймет ...

person vanna    schedule 24.08.2010
comment
Ваше здоровье! Мне это было нужно, чтобы я мог ввести символ авторского права в свой командный файл. - person Lea Hayes; 30.07.2012
comment
Это отлично сработало и у меня в ситуации, почти идентичной вашей. Вместо этого мой путь содержал ирландские гэльские символы, то есть á, é, í, ó и ú. - person Seany84; 05.02.2014
comment
@vanna, которая решает мои турецкие символы и пробелы в пути в сети. ты замечательный. - person caglaror; 04.12.2014
comment
Также найдите эти ресурсы: msdn. microsoft.com/en-us/library/windows/desktop/, ss64.com/nt /chcp.html, technet.microsoft.com/en-us /library/bb490874.aspx Турецкий chcp - 857. - person caglaror; 04.12.2014
comment
Возможно, вам просто нужно было использовать другой шрифт для правильного отображения символов, Lucida Console у меня сработала. - person Vlastimil Ovčáčík; 05.01.2016
comment
Windows-1250 - это кодовая страница, используемая в Microsoft Windows для представления текстов на языках Центральной Европы и Восточной Европы с использованием латинского алфавита, таких как польский, чешский, словацкий, венгерский, словенский, боснийский, хорватский, сербский (латинский алфавит), румынский ( до реформы правописания 1993 г.) и албанский. - person endolith; 29.11.2016
comment
cp1250 по-прежнему является 8-битным набором символов, он по-прежнему поддерживает только 256 символов, просто меняет то, что это за символы. - person ivan_pozdeev; 28.10.2017
comment
Наконец-то полезный ответ! Отображаемые символы по-прежнему искажены, но аргументы (имена файлов с акцентами) теперь правильно передаются вызываемым программам. Спасибо! (Я тоже из Чехии) - person Pontiac_CZ; 14.11.2018

Проверьте язык на наличие программ, не поддерживающих Юникод. Если у вас проблемы с русским языком в консоли Windows, то вам следует установить русский язык здесь:

Изменение языка для программ, не поддерживающих Юникод

person Maxim Yefremov    schedule 07.04.2013
comment
Это не включает поддержку Unicode в cmd, а только переключает кодовую страницу по умолчанию на cp866, которая по-прежнему является 8-битным набором символов. Он даже использует cp866 вместо cp1251, что добавляет кучу неприятностей. - person ivan_pozdeev; 28.10.2017
comment
См. Также мой ответ ниже, чтобы узнать о новой опции в новых версиях Windows 10. - person zvi; 14.04.2019

Изменить кодовую страницу консоли Windows по умолчанию довольно сложно. При поиске в Интернете вы найдете разные предложения, однако некоторые из них могут полностью сломать вашу Windows, то есть ваш компьютер больше не загружается.

Наиболее безопасным решением является следующее: перейдите к ключу реестра HKEY_CURRENT_USER\Software\Microsoft\Command Processor и добавьте строковое значение Autorun = chcp 65001.

Или вы можете использовать этот небольшой пакетный скрипт для наиболее распространенных кодовых страниц.

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

Использование @chcp 65001>nul вместо chcp 65001 подавляет вывод «Активная кодовая страница: 65001», который вы будете получать каждый раз при запуске нового окна командной строки.

Полный список всех доступных номеров можно получить по адресу Идентификаторы кодовой страницы

Обратите внимание, что настройки будут применяться только для текущего пользователя. Если вы хотите установить его для всех пользователей, замените строку SET ROOT_KEY="HKEY_CURRENT_USER" на SET ROOT_KEY="HKEY_LOCAL_MACHINE"

person Wernfried Domscheit    schedule 02.11.2015
comment
хорошая идея и полезный пример! - person ; 05.12.2015

На самом деле хитрость в том, что командная строка действительно понимает эти неанглийские символы, просто не может их правильно отобразить.

Когда я ввожу в командную строку путь, содержащий неанглийские символы, он отображается как «?? ?????? ?????». Когда вы отправляете свою команду (в моем случае cd "??? ?????? ?????"), все работает, как ожидалось.

person User    schedule 14.04.2009
comment
Это, вероятно, немного опасно, так как может возникнуть конфликт имен. например, если у вас есть два файла, которые отображаются как ???, и вы вводите cd ??? он не знал бы, что использовать (или, что еще хуже, выберет произвольный). - person John; 16.06.2009
comment
Вы не вводите ???, вы вводите настоящее имя, оно просто отображается как ???. Думайте об этом как о поле для ввода пароля. Все, что вы вводите, отображается как ***, но отправленный - это исходный текст. - person User; 16.06.2009
comment
Это действительно работает для команд, запускаемых непосредственно в командной строке. Однако при запуске пакетного файла .cmd мне все равно нужно поместить chcp 65001 в начало пакетного файла. - person wisbucky; 24.10.2017
comment
В вашем случае это проблема со шрифтом ... контент есть, просто нет подходящего шрифта для его отображения. Но OP другое. - person WesternGun; 30.10.2017

На машине с Windows 10 x64 я сделал так, чтобы в командной строке отображались неанглийские символы:

Откройте командную строку с повышенными привилегиями (запустите CMD.EXE от имени администратора). Запросите в реестре доступные шрифты TrueType для консоли:

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

Вы увидите такой вывод:

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

Теперь нам нужно добавить шрифт TrueType, который поддерживает нужные вам символы, например Courier New. Мы делаем это, добавляя нули к имени строки, поэтому в этом случае следующим будет «000»:

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

Теперь реализуем поддержку UTF-8:

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

Установите шрифт по умолчанию "Courier New":

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

Установите размер шрифта на 20:

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

Включите быстрое редактирование, если хотите:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
person Alon Or    schedule 01.08.2016
comment
В целом использование кодовой страницы 65001 будет работать без ошибок только в Windows 10 с обновлением Creators. В Windows 7 будут ошибки как вывода, так и ввода. В Windows 8 и более старых версиях Windows 10 есть только ошибка ввода, которая ограничивает ввод 7-битным ASCII. - person Eryk Sun; 09.09.2017
comment
Я пробовал использовать этот метод, и теперь шрифт очень маленький и кажется постоянным. - person Green; 18.10.2020

Поскольку я не видел полных ответов для Python 2.7, я опишу два важных шага и дополнительный шаг, который весьма полезен.

  1. Вам нужен шрифт с поддержкой Unicode. Windows поставляется с Lucida Console, которую можно выбрать, щелкнув правой кнопкой мыши строку заголовка командной строки и выбрав параметр Defaults. Это также дает доступ к цветам. Обратите внимание, что вы также можете изменить настройки для командных окон, вызываемых определенными способами (например, открыть здесь, Visual Studio), выбрав вместо этого Properties.
  2. Вам необходимо установить кодовую страницу на cp65001, что похоже на попытку Microsoft предложить поддержку UTF-7 и UTF-8 в командной строке. Сделайте это, запустив chcp 65001 в командной строке. После установки он остается таким, пока окно не закроется. Вам нужно будет повторять это каждый раз при запуске cmd.exe.

Чтобы получить более постоянное решение, обратитесь к этому ответу на суперпользователе. Короче говоря, создайте запись REG_SZ (String) с помощью regedit в HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor и назовите ее AutoRun. Измените его значение на chcp 65001. Если вы не хотите видеть выходное сообщение команды, используйте вместо этого @chcp 65001>nul.

У некоторых программ возникают проблемы с взаимодействием с этой кодировкой, примечательно, что MinGW дает сбой при компиляции с бессмысленным сообщением об ошибке. Тем не менее, это работает очень хорошо и не вызывает ошибок в большинстве программ.

person Aaron3468    schedule 07.04.2016

Начиная с июня 2019 года с Windows 10 вам не придется менять кодовую страницу.

См. «Введение в терминал Windows» (из Kayla Cinnamon) и Microsoft / Terminal.
За счет использования шрифта Consolas будет обеспечена частичная поддержка Unicode.

Как описано в Microsoft/Terminal issue 387:

В настоящее время Unicode содержит 87 887 идеографов. Все они вам тоже нужны?
Нам нужна граница, а символы за этой границей должны обрабатываться резервным шрифтом / связыванием шрифтов / чем-то еще.

Какие консолы должны охватывать:

  • Символы, которые используются в качестве символов, используемых современными программами OSS в интерфейсе командной строки.
  • Эти символы должны соответствовать дизайну и метрикам Консола и должным образом выровнены с существующими символами Консола.

Что НЕ следует включать в Consolas:

  • Символы и пунктуация шрифтов, отличных от латинского, греческого и кириллического, особенно символов, нуждаются в сложном оформлении (например, в арабском).
  • Эти символы следует обрабатывать с помощью резервного шрифта.
person VonC    schedule 06.05.2019

Один действительно простой вариант - установить оболочку Windows bash, такую ​​как MinGW, и использовать ее:

Введите здесь описание изображения

Существует небольшая кривая обучения, поскольку вам нужно будет использовать функциональность командной строки Unix, но вам понравится ее сила, и вы можете установить набор символов консоли на UTF-8.

Введите здесь описание изображения

Конечно, вы также получаете все обычные * nix-полезности, такие как grep, find, less и т. Д.

person Steve Barnes    schedule 02.01.2016
comment
В этом (старом) случае проблема заключалась в сценарии, а не в консоли. Решит ли это использование сценариев bash? - person Vilx-; 02.01.2016
comment
Да, действительно, они деревянные сценарии bash могут быть помечены как UTF-8 и просто работают с гораздо большей мощностью, чем пакетные файлы Windows - я знаю, что это был старый случай, но подумал, что этот вариант стоит отметить для дальнейшего использования, поскольку MS не кажется чтобы стать лучше в Юникоде. - person Steve Barnes; 03.01.2016
comment
grep, find и меньше. - person Peter Mortensen; 02.01.2017
comment
Вывод символов в кодировке UTF-8 в порядке. Но ввод по-прежнему кодируется системной кодовой страницей. - person Rick; 06.06.2018
comment
Просто чтобы добавить, что у пользователей Windows, возможно, уже есть оболочка bash, если вы используете Git: просто откройте окно Git ›Git Bash. - person skomisa; 25.09.2018

Я нашел этот метод полезным в новых версиях Windows 10:

Включите эту функцию: «Бета: используйте Unicode UTF-8 для поддержки языков во всем мире»

Панель управления -> Региональные настройки -> вкладка Администрирование-> Изменить язык системы ...

«Настройки

person zvi    schedule 14.04.2019
comment
Как добиться этого с помощью PowerShell или cmd? - person Corey; 19.11.2019
comment
Я пытаюсь отобразить китайские символы в консоли, но это не сработало в 64-разрядной версии Windows 10 (установлено на турецком языке, а затем изменено на английский). Далее попробую установить китайский язык и посмотрю, работает ли. - person akinuri; 25.04.2020
comment
Только будьте осторожны, это нарушило функциональность некоторых старых и дрянных программ, которые нормально работали на сервере 2019. - person Alon Or; 26.01.2021

Для аналогичной проблемы (моя проблема заключалась в том, чтобы показать символы UTF-8 из MySQL в командной строке),

Я решил это так:

  1. Я изменил шрифт командной строки на Lucida Console. (Этот шаг не должен иметь отношения к вашей ситуации. Он имеет отношение только к тому, что вы видите на экране, а не к тому, что на самом деле является персонажем).

  2. Я изменил кодовую страницу на Windows-1253. Вы делаете это в командной строке с помощью «chcp 1253». Это сработало для моего случая, когда я хотел увидеть UTF-8.

person Christoforos    schedule 02.12.2012
comment
Windws-1253 не является кодовой страницей Unicode. Это стандартная кодовая страница из 256 символов. По-видимому, вы использовали только символы, которые могут отображаться на этой кодовой странице, но это не будет универсальным. - person Vilx-; 02.12.2012

Эта проблема очень раздражает. Обычно в имени файла и содержимом файла используются китайские символы. Обратите внимание, что я использую Windows 10, вот мое решение:

Чтобы отобразить имя файла, например dir или ls, если вы установили Ubuntu bash в Windows 10

  1. Установите регион для поддержки символов без UTF 8.

  2. После этого шрифт консоли будет изменен на шрифт этой локали, а также изменится кодировка консоли.

После того, как вы выполнили предыдущие шаги, чтобы отобразить содержимое файла файла UTF-8 с помощью инструмента командной строки

  1. Измените страницу на utf-8 на chcp 65001
  2. Измените шрифт, поддерживающий utf-8, например Lucida Console.
  3. Используйте команду type, чтобы просмотреть содержимое файла, или cat, если вы установили Ubuntu bash в Windows 10.
  4. Обратите внимание, что после установки кодировки консоли на utf-8 я не могу ввести китайский символ в cmd, используя китайский метод ввода.

Самое ленивое решение: просто используйте эмулятор консоли, например http://cmder.net/.

person code4j    schedule 22.01.2017
comment
Это не для меня. Китайские символы в выводе команды point по-прежнему искажены. - person Ssuching Yu; 15.01.2018
comment
@SiqingYu Я отказываюсь от безумной обстановки. Просто используйте blog.miniasp.com/post/2015/ 27 сентября / Useful-tool-Cmder.aspx - person code4j; 16.01.2018
comment
Раньше я использовал Cmder, но он не может заменить консоль разработчика, используемую Visual Studio. - person Ssuching Yu; 17.01.2018
comment
@SiqingYu Вы имеете в виду интерактивную оболочку PowerShell C #? - person code4j; 18.01.2018
comment
Не интерактивная оболочка питания, а консоль разработчика, тоже используемая Visual C ++. Это консоль отладки по умолчанию в проектах консольных приложений Win32. - person Ssuching Yu; 18.01.2018

Я вижу здесь несколько ответов, но они, похоже, не касаются вопроса - пользователь хочет получить ввод Unicode из командной строки.

Windows использует UTF-16 для кодирования двухбайтовых строк, поэтому вам нужно получить их из ОС в своей программе. Есть два способа сделать это -

1) У Microsoft есть расширение, которое позволяет main принимать широкий массив символов: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Вызовите API Windows, чтобы получить версию командной строки в Юникоде wchar_t win_argv = (wchar_t) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Прочтите это: http://utf8everywhere.org для получения подробной информации, особенно если вы поддерживаете другие операционные системы.

person Robert Boehne    schedule 31.08.2018
comment
Ах, нет, извини, но ты упустил вопрос. Это когда я пишу программу, которая будет получать символы Юникода. Мой вопрос касался отправки символов Юникода в другую программу (которая, надеюсь, поддерживает их получение, но у меня действительно нет другого способа узнать, кроме разборки). - person Vilx-; 31.08.2018

Быстрое решение для файлов .bat, если ваш компьютер отображает ваш путь / имя файла правильно, когда вы вводите его в окне DOS:

  1. copy con temp.txt [нажмите Enter]
  2. Введите путь / имя файла [нажмите Enter]
  3. Нажмите Ctrl-Z [нажмите Enter]

Таким образом вы создадите файл .txt - temp.txt. Откройте его в Блокноте, скопируйте текст (не волнуйтесь, он будет нечитабельным) и вставьте его в свой .bat-файл. Выполнение созданного таким образом .bat в DOS-окне у меня работало (кириллица, болгарский).

person S. Hristov    schedule 09.04.2015

Что можно сделать лучше: просто установите доступный бесплатный языковой пакет Microsoft для японского языка. (Другие восточные языковые пакеты также будут работать, но я тестировал японский.)

Это дает вам шрифты с большим набором глифов, делает их поведением по умолчанию, изменяет различные инструменты Windows, такие как cmd, WordPad и т. Д.

person Mike Beckerle    schedule 31.05.2013

У меня работает изменение кодовой страницы на 1252. Проблема для меня в том, что символ double doller § преобразуется в другой символ DOS в Windows Server 2008.

Я использовал CHCP 1252 и колпачок перед ним в своем заявлении о BCP ^ §.

person madhav bitra    schedule 12.02.2015
comment
Спасибо, это работает! Я не знаю, почему люди проголосовали против этого, это действительная альтернатива для некоторых людей .. Эта кодовая страница 1252 действительно решает проблему также на Windows Server 2012, где тот же код с CP 65001 не работал у меня. Я полагаю, это зависит от того, в какой кодовой странице был отредактирован пакетный скрипт, или от настроек ОС по умолчанию. В этом случае он был создан с помощью Блокнота на немецкой машине MUI с базовой ОС en-US. - person Tony Wall; 05.01.2017

Я обошел аналогичную проблему, удаляя файлы с именами Unicode, ссылаясь на них в пакетном файле по их коротким (8 точек 3) именам.

Короткие имена можно просмотреть, выполнив dir /x. Очевидно, это работает только с уже известными именами файлов Unicode.

person Michael    schedule 02.12.2015
comment
на новых дисках создание имен 8.3 отключено по умолчанию, и это не сработает - person phuclv; 17.04.2021