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

StackOverflow https://stackoverflow.com/questions/388490

Вопрос

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

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

Это было полезно?

Решение

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

  • CMD и «консоль» - не связанные с факторы. CMD.exe это только одна из программ, которые готовы «работать внутри» консоли («Консольные приложения»).
  • НАСКОЛЬКО МНЕ ИЗВЕСТНО, CMD имеет идеальную поддержку Unicode; Вы можете ввести/выводить все чары Unicode, когда Любые Codepage активна.
  • Консоль Windows обладает большой поддержкой Unicode - но она не идеальна (просто «достаточно хорошо»; см. Ниже).
  • chcp 65001 очень опасно. Если программа не была специально разработана, чтобы обойти дефекты в API Windows (или использует библиотеку времени выполнения C, которая имеет эти обходные пути), она не будет работать надежно. Win8 устраняет ½ из этих проблем с cp65001, но остальное все еще применимо к Win10.
  • я работаю в cp1252. Анкет Как я уже говорил: Для ввода/вывода Unicode в консоли не нужно устанавливать CodePAGE.

Детали

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

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

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

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

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

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

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

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


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

Резюме

  • Установите шрифт, макет клавиатуры (и, необязательно, позволяйте шестиграннику).

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

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

Другие советы

Пытаться:

chcp 65001

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

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

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

В файле партии измените страницу Charset

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

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

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

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

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

Changing language for non-Unicode programs

Это довольно сложно изменить кодирование по умолчанию консоли 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"

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

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

На машине 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, который поддерживает персонажей, которые вам нужны, как курьерский новый. Мы делаем это, добавив нули к имени строки, поэтому в этом случае следующим будет "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

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

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

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

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

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

Enter image description here

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

Enter image description here

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

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

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

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

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

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

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

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

Region Settings

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

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

  1. Установите регион, чтобы поддержать не UTF 8.

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

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

  1. Изменить страницу на UTF-8 chcp 65001
  2. Переход к шрифту, который поддерживает UTF-8, такой как консоль Lucida
  3. Использовать type командовать, чтобы посмотреть содержимое файла, или cat Если вы установили Ubuntu Bash на Windows 10
  4. Обратите внимание, что после установки кодирования консоли в UTF-8 я не могу ввести китайский символ в CMD, используя метод ввода Китая.

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

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

  1. Копировать con temp.txt нажмите Ввод
  2. Введите имя PATH/FILE [нажмите ENTER
  3. Нажимать Ctrl-Z нажмите Ввод

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

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

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

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

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

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

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

Видеть "Представление терминала Windows" (из Кайла Корица) и Microsoft/терминал.
Благодаря использованию шрифта Consolas, частичный Поддержка Unicode будет предоставлена.

Как задокументировано в Microsoft/Terminal Выпуск 387:

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

Что должно покрывать консолы:

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

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

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

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

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

В UTF-8: chcp 65001

Вернуться к дефолту: chcp 437

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top