Как использовать символы Unicode в командной строке Windows?
У нас есть проект в Team Foundation Server (TFS), в котором есть неанглийский символ (š). При попытке script нескольких связанных с сборкой вещей мы наткнулись на проблему - мы не можем передать письмо š в средства командной строки. Командная строка или что еще не испортила ее, а утилита tf.exe не может найти указанный проект.
Я пробовал разные форматы для .bat файла (ANSI, UTF-8 с и без спецификация), а также скрипты в JavaScript (который по сути является Unicode) - но не повезло. Как выполнить программу и передать ей командную строку Unicode?
Ответы
Ответ 1
Мой опыт: я использую ввод/вывод Unicode в консоли в течение многих лет (и делаю это много раз в день. Более того, я разрабатываю инструменты поддержки именно для этой задачи) Существует очень мало проблем, насколько вы понимаете следующие факты/ограничения:
-
CMD
и "консоль" являются несвязанными факторами. CMD.exe
- это всего лишь одна из программ, которые готовы "работать внутри" консоли ("консольные приложения"). - AFAIK,
CMD
имеет отличную поддержку Unicode; Вы можете вводить/выводить все символы Unicode, когда активна любая кодовая страница. - Консоль Windows имеет МНОГО поддержки Unicode - но она не идеальна (просто "достаточно хороша"; см. Ниже).
-
chcp 65001
очень опасен. Если программа не была специально разработана для обхода дефектов в Windows API (или не использует библиотеку времени выполнения C, которая имеет эти обходные пути), она не будет работать надежно. Win8 исправляет cp65001
этих проблем с cp65001
, но остальное все еще применимо к Win10. - Я работаю в
cp1252
. Как я уже сказал: для ввода/вывода Unicode в консоли не нужно устанавливать кодовую страницу.
Детали
- Для чтения/записи Unicode на консоль приложение (или его библиотека времени выполнения C) должно быть достаточно умным, чтобы использовать не API-интерфейс
File-I/O
, а API-интерфейс Console-I/O
(Например, посмотрите, как это делает Python.) - Аналогично, чтобы читать аргументы командной строки Unicode, приложение (или его библиотека времени выполнения C) должно быть достаточно умным, чтобы использовать соответствующий API.
- Консольный рендеринг шрифтов поддерживает только символы Юникода в BMP (другими словами: ниже
U+10000
). Поддерживается только простая отрисовка текста (поэтому европейские и некоторые восточноазиатские языки должны нормально работать, если используются предварительно составленные формы). [Здесь есть мелкий мелкий шрифт для восточной азии и для символов U + 0000, U + 0001, U + 30FB.]
Практические соображения
-
Значения по умолчанию для Window не очень полезны. Для лучшего опыта нужно настроить 3 части конфигурации:
- Для вывода: полный консольный шрифт. Для достижения наилучших результатов я рекомендую мои сборки. (Инструкции по установке присутствуют там - и также перечислены в других ответах на этой странице.)
- Для ввода: способная раскладка клавиатуры. Для достижения наилучших результатов я рекомендую мои макеты.
- Для ввода: разрешить шестнадцатеричный ввод Unicode.
-
Еще одна ошибка с "Вставкой" в консольное приложение (очень техническое):
- Ввод шестнадцатеричных символов обеспечивает ввод символа
KeyUp
из Alt
; все другие способы доставки персонажа происходят в KeyDown
; так много приложений не готовы увидеть символ в KeyUp
. (Применимо только к приложениям, использующим Console-I/O
API.) - Вывод: многие приложения не будут реагировать на входные события HEX.
- Кроме того, то, что происходит с "вставленным" символом, зависит от текущей раскладки клавиатуры: если символ можно набирать без использования префиксных клавиш (но с произвольной сложной комбинацией модификаторов, как в
Ctrl-Alt-AltGr-Kana-Shift-Gray*
) затем он доставляется по нажатию эмулируемой клавиши. Это то, что ожидает любое приложение - так что вставка всего, что содержит только такие символы, это хорошо. - Однако "другие" символы доставляются путем эмуляции ввода HEX.
Вывод: если раскладка клавиатуры не поддерживает ввод МНОЖЕГО символов без префиксных клавиш, некоторые ошибочные приложения могут пропускать символы при Paste
через интерфейс консоли: Alt-Space EP
. (Вот почему я рекомендую использовать раскладки клавиатуры!)
Следует также иметь в виду, что "альтернативные, более функциональные консоли" для Windows вовсе не являются консолями. Они не поддерживают API-интерфейсы Console-I/O
, поэтому программы, использующие эти API-интерфейсы, не будут работать. (Программы, которые используют только "API-интерфейсы файлового ввода-вывода для файловых дескрипторов консоли", будут работать нормально).
Одним из примеров такого неконсольного является часть MicroSofts Powershell
. Я не использую это; чтобы поэкспериментировать, нажмите и отпустите WinKey
, затем введите powershell
.
(С другой стороны, существуют программы, такие как ConEmu
или ANSICON
которые пытаются сделать больше: они "пытаются" перехватить API-интерфейсы Console-I/O
чтобы заставить работать "настоящие консольные приложения". Это определенно работает для игрушечных примеров программ; в реальной жизни это может или не может решить ваши конкретные проблемы. Эксперимент.)
Резюме
-
установить шрифт, раскладку клавиатуры (и при желании разрешить ввод в шестнадцатеричном формате).
-
используйте только те программы, которые проходят через API-интерфейсы Console-I/O
и принимают аргументы командной строки Unicode. Например, любая программа cygwin
-compiled должна подойти. Как я уже сказал, CMD
тоже хорошо.
UPD: Изначально из-за ошибки в cp65001
я смешивал слои ядра и CRTL (UPD²: и API пользовательского режима Windows!). Также: Win8 исправляет половину этой ошибки; Я разъяснил раздел о приложении "лучшая консоль" и добавил ссылку на то, как это делает Python.
Ответ 2
Try:
chcp 65001
который изменит кодовую страницу на UTF-8. Кроме того, вам нужно использовать консольные шрифты Lucida.
Ответ 3
У меня была такая же проблема (я из Чехии). У меня есть английская установка Windows, и мне приходится работать с файлами на общем диске. Пути к файлам включают чешские символы.
Решение, которое работает для меня, это:
В пакетном файле измените страницу кодировки
Мой командный файл:
chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp
Пакетный файл должен быть сохранен в CP 1250.
Обратите внимание, что консоль не будет отображать символы правильно, но она их поймет...
Ответ 4
Проверьте язык для программ, отличных от Юникода. Если у вас проблемы с русским в консоли Windows, вы должны установить здесь русский язык:
Ответ 5
Трудно изменить консоль Codepage для Windows по умолчанию. При поиске в Интернете вы найдете разные предложения, однако некоторые из них могут полностью разбить вашу Windows, т.е. Ваш компьютер больше не загружается.
Наиболее безопасным решением является следующее:
Перейдите к своему ключу реестра HKEY_CURRENT_USER\Software\Microsoft\Command Processor
и добавьте значение строки Autorun
= chcp 65001
.
Или вы можете использовать эту небольшую Batch- Script для наиболее распространенных кодовых страниц.
@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
подавляет вывод "Active code page: 65001", который вы получите каждый раз при запуске новых окон командной строки.
Полный список всего доступного номера, который вы можете получить от Идентификаторы кодовой страницы
Обратите внимание, что настройки будут применяться только для текущего пользователя. Если вы хотите установить его для всех пользователей, замените строку SET ROOT_KEY="HKEY_CURRENT_USER"
на SET ROOT_KEY="HKEY_LOCAL_MACHINE"
Ответ 6
Собственно, фокус в том, что командная строка действительно понимает эти неанглийские символы, просто не может отобразить их правильно.
Когда я ввожу путь в командной строке, содержащий некоторые неанглийские уклоны, он отображается как "???????????". Когда вы отправляете свою команду (cd "????????????" в моем случае), все работает как ожидалось.
Ответ 7
На машине с 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
Ответ 8
Поскольку я не видел никаких полных ответов для Python 2.7, я расскажу о двух важных шагах и необязательном шаге, который весьма полезен.
- Вам нужен шрифт с поддержкой Unicode. Windows поставляется с Lucida Console, которая может быть выбрана клавишей , щелкнув правой кнопкой мыши строку заголовка командной строки и нажав кнопку
Defaults
. Это также дает доступ к цветам. Обратите внимание, что вы также можете изменять настройки для окон команд, вызываемых определенным образом (например, открывать здесь, Visual Studio), выбирая вместо этого Properties
.
- Вам нужно установить кодовую страницу
cp65001
, которая, как представляется, пытается попытаться предложить поддержку 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 является заметным, который сбой при компиляции с бессмысленным сообщением об ошибке. Тем не менее, это работает очень хорошо и не вызывает ошибок с большинством программ.
Ответ 9
Один очень простой способ - установить оболочку Windows bash, такую как MinGW и использовать ее:
Существует немного кривая обучения, так как вам нужно будет использовать функциональность командной строки Unix, но вам понравится ее мощь, и вы можете установить набор символов консоли UTF-8.
Конечно, вы также получаете все обычные * nix лакомства, такие как grep, find, less и т.д.
Ответ 10
Для аналогичной проблемы (моя проблема заключалась в том, чтобы показать символы UTF-8 из MySQL в командной строке),
Я решил это так:
-
Я изменил шрифт командной строки на Lucida Console. (Этот шаг должен быть неактуальным для вашей ситуации. Он должен делать только то, что вы видите на экране, а не то, что на самом деле является персонажем).
-
Я изменил кодовую страницу на Windows-1253. Вы делаете это в командной строке с помощью "chcp 1253". Это сработало для моего случая, когда я хотел видеть UTF-8.
Ответ 11
Эта проблема довольно раздражает. Обычно у меня есть китайский символ в имени файла и в файле. Обратите внимание, что я использую Windows 10, вот мое решение:
Чтобы отобразить имя файла, например, dir
или ls
если вы установили Ubuntu bash в Windows 10
-
Установите регион для поддержки не-utf 8 символов.
-
После этого шрифт консоли будет изменен на шрифт этой локали, а также изменит кодировку консоли.
После того, как вы сделали предыдущие шаги, чтобы отобразить содержимое файла файла UTF-8 с помощью инструмента командной строки
- Измените страницу на utf-8 на
chcp 65001
- Изменить шрифт, поддерживающий utf-8, например, Lucida Console
- Используйте команду
type
для просмотра содержимого файла или cat
если вы установили Ubuntu bash в Windows 10 - Обратите внимание, что после установки кодировки консоли на utf-8 я не могу ввести китайский символ в cmd, используя китайский метод ввода.
Самое ленивое решение: просто используйте консольный эмулятор, такой как http://cmder.net/
Ответ 12
Лучше сделать чистую вещь: просто установите бесплатный бесплатный пакет Microsoft для японского языка. (Другие восточные языковые пакеты также будут работать, но я протестировал японский язык.)
Это дает вам шрифты с большими наборами глифов, делает их по умолчанию, меняет различные инструменты Windows, такие как cmd, WordPad и т.д.
Ответ 13
Изменение кодовой страницы до 1252 работает для меня. Проблема для меня - символ double doller § преобразуется в другой символ DOS на Windows Server 2008.
Я использовал CHCP 1252 и кепку перед этим в своем заявлении BCP ^ §.
Ответ 14
Быстрое решение для файлов .bat, если компьютер отображает ваше имя пути/файла правильно, когда вы вводите его в DOS-окне:
- copy con temp.txt [нажмите Enter]
- Введите имя пути/файла [нажмите Enter]
- Нажмите Ctrl-Z [нажмите Enter]
Таким образом вы создаете файл .txt - temp.txt. Откройте его в "Блокноте", скопируйте текст (не беспокойтесь, он будет выглядеть нечитаемым) и вставьте его в ваш .bat файл.
Выполнение .bat, созданного таким образом в DOS-окне, работало для меня (кириллица, болгарина).
Ответ 15
Здесь я вижу несколько ответов, но они, похоже, не затрагивают вопрос - пользователь хочет получить Unicode-вход из командной строки.
Windows использует UTF-16 для кодирования в двух байтовых строках, поэтому вам нужно получить их из ОС в своей программе. Есть два способа сделать это -
1) Microsoft имеет расширение, которое позволяет main принимать широкий массив символов: int wmain (int argc, wchar_t * argv []); 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 для получения подробной информации, особенно если вы поддерживаете другие операционные системы.
Ответ 16
Я нашел этот метод полезным в новых версиях Windows 10:
Включите эту функцию: "Бета-версия: используйте Unicode UTF-8 для всемирной языковой поддержки"
Панель управления → Региональные настройки → Административные tab-> Изменить язык системы...
Ответ 17
У меня возникла аналогичная проблема с удалением Unicode-названных файлов, обратившись к ним в пакетном файле по их коротким именам (8 точек 3).
Краткие имена можно просмотреть, выполнив dir /x
. Очевидно, что это работает только с именами файлов Unicode, которые уже известны.
Ответ 18
Начиная с июня 2019 года, с Windows 10 вам не придется менять кодовую страницу.
См. " Знакомство с терминалом Windows " (от Кайлы Синнамон) и Microsoft/Терминал.
Благодаря использованию шрифта Consolas будет обеспечена частичная поддержка Unicode.
Как описано в выпуске Microsoft/Terminal
387:
В настоящее время в Юникоде насчитывается 87 887 иероглифов. Тебе они тоже нужны?
Нам нужна граница, и символы за этой границей должны обрабатываться резервным шрифтом/связыванием шрифта/чем угодно.
Что Консолас должен покрыть:
- Символы, используемые в качестве символов, которые используются современными программами OSS в CLI.
- Эти персонажи должны соответствовать дизайну и метрикам Консоласа, и должны быть правильно выровнены с существующими персонажами Консоласа
Что Консолас НЕ должен покрывать:
- Символы и знаки препинания, которые помимо латинского, греческого и кириллического, особенно символов, нуждаются в сложном формировании (например, арабском).
- Эти символы должны обрабатываться с резервным шрифтом.
Ответ 19
Бразильский португальский код 1252
:
chcp 1252
Ответ 20
В utf-8: chcp 65001
Назад к умолчанию: chcp 437