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

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

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

17 ответов


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

  • CMD и "консоль" являются несвязанными факторами. CMD.exe - это только одна из программ, которые готовы "работать внутри" консоли ("консольные приложения").
  • насколько я знаю, CMD имеет идеальную поддержку Unicode; вы можете вводить/выводить все символы Unicode, когда любой кодовая страница является активной.
  • консоль Windows имеет большую поддержку Unicode-но она не идеальна (просто "достаточно хороша"; см. ниже).
  • chcp 65001 - Это очень опасно. Если программа не была специально разработана для работы с дефектами в ядре Windows (или использует библиотеку времени выполнения C, которая имеет эти обходные пути), она не будет работать надежно. Win8 исправляет ½ этих проблем с cp65001, но остальное по-прежнему применим к Win10.
  • я работаю в cp1252. Как я уже сказал:для ввода / вывода Unicode в консоли не нужно устанавливать кодовую страницу.

подробности

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

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

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

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

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

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

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

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


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

резюме

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

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

UPD: первоначально, для ошибки в cp65001, я смешивал ядро и CRTL слои. также: Win8 исправляет половину этой ошибки; я уточнил раздел о приложении "лучшая консоль" и добавил ссылку на то, как это делает Python.


попробуй:

chcp 65001

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


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

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

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

мой пакетный файл:

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

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

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


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

Changing language for non-Unicode programs


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

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


это довольно трудно изменить кодовую страницу по умолчанию в консоли 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 подавляет вывод "активная кодовая страница: 65001", который вы получите при каждом запуске новой командной строки windows.

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

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


на машине 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

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

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

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

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


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

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

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

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


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

Enter image description here

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

Enter image description here

конечно, вы также получаете все обычные * Nix лакомства, такие как grep, find, меньше, так далее.


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

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

  1. установите регион для поддержки символа non-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/


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

  1. копировать Con temp.txt [нажмите Enter]
  2. введите путь/имя файла [нажмите Enter]
  3. пресс Ctrl-Z [нажмите Enter]

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


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

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


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

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


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

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

1) Microsoft имеет расширение, которое позволяет main принимать широкий массив символов: инт функции wmain(АГДС, тип wchar_t *агду[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) вызовите Windows api, чтобы получить unicode версию командной строки тип 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 для получения подробной информации, особенно если вы поддерживаете другие операционная система.


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

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


в utf-8: chcp 65001

по умолчанию: chcp 437