Как использовать символы Юникода в командной строке Windows? - PullRequest
292 голосов
/ 23 декабря 2008

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

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

Ответы [ 19 ]

367 голосов
/ 23 декабря 2008

Попробуйте:

chcp 65001

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

44 голосов
/ 16 декабря 2017

Мой опыт: я использую 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.
  • Консольный рендеринг шрифтов поддерживает только символы Юникода в BMP (другими словами: ниже U+10000). Поддерживается только простая отрисовка текста (поэтому европейские и некоторые восточноазиатские языки должны нормально работать, если используются предварительно составленные формы). [Здесь есть мелкий мелкий шрифт для восточноазиатских языков и символов U + 0000, U + 0001, U + 30FB.]

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

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

    • Для вывода: полный консольный шрифт. Для достижения наилучших результатов я рекомендую мои сборки . (Инструкции по установке там есть, а также перечислены в других ответах на этой странице.)
    • Для ввода: способная раскладка клавиатуры. Для достижения наилучших результатов я рекомендую мои макеты .
    • Для ввода: разрешить шестнадцатеричный ввод Unicode .
  • Еще одна ошибка с «Вставкой» в консольное приложение (очень техническое):

    • шестнадцатеричный ввод поставляет символ на KeyUp из Alt; все другие способы доставки персонажа происходят на KeyDown; так много приложений не готовы увидеть символ на KeyUp. (Применимо только к приложениям, использующим Console-I/O API.)
    • Вывод: многие приложения не будут реагировать на события ввода HEX.
    • Более того, то, что происходит с «вставленным» символом, зависит от текущей раскладки клавиатуры: если символ можно набирать без использования префиксных клавиш (но с произвольной сложной комбинацией модификаторов, как в Ctrl-Alt-AltGr-Kana-Shift-Gray*), то он доставляется на эмулированное нажатие клавиши. Это то, что ожидает любое приложение - так что вставка чего-либо, содержащего только такие символы, вполне подойдет.
    • Однако «другие» символы доставляются с помощью , имитирующего ввод HEX .

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

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

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


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

Резюме

  • установить шрифт, раскладку клавиатуры (и, необязательно, разрешить ввод в шестнадцатеричном формате).

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

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

36 голосов
/ 24 августа 2010

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

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

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

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

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

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

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

25 голосов
/ 07 апреля 2013

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

Changing language for non-Unicode programs

13 голосов
/ 02 ноября 2015

Довольно сложно изменить кодовую страницу по умолчанию консоли 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», который вы будете получать при каждом запуске новой командной строки Windows.

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

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

12 голосов
/ 14 апреля 2009

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

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

10 голосов
/ 01 августа 2016

На компьютере с 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

Установить шрифт по умолчанию на «Новый курьер»:

    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
5 голосов
/ 07 апреля 2016

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

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

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

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

4 голосов
/ 02 января 2016

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

Enter image description here

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

Enter image description here

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

3 голосов
/ 02 декабря 2012

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

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

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

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

...