Я хочу использовать символ ♪ внутри пользовательского приглашения для командной строки. Это нужно сделать из моего пакетного файла AutoRun. chcp
дает результат Active code page: 437
. Если я ввожу в консоль через cmd.exe, запущенный в приложении Windows Terminal prompt ♪$G
, он работает, как и ожидалось, меняя подсказку на ♪>
.
Однако, если я введу prompt ♪$G
в файл .bat с vscode с кодировкой CP 437 или Windows 1252, теперь будет вывод:
prompt ?$G
?>
При сохранении с кодировкой UTF-8 вывод будет таким:
prompt ΓÖ¬$G
ΓÖ¬>
Как я могу изменить подсказку на ♪> из пакетного файла? В какой кодировке сохранить файл? Нужно ли мне использовать шестнадцатеричный редактор каким-либо образом?
В статье Википедии о кодовой странице есть список всех кодовых страниц и ссылка на OEM кодовую страницу 437 и Windows-1252 . Обе кодовые страницы не содержат символ ♪
, поэтому Visual Studio Code сохранил пакетный файл в кодировке UTF-8.
@Mofi Статья в Википедии с кодовой страницей 437, на которую вы ссылаетесь, буквально содержит символ ♪
в позиции 0x0D
Когда вы пишете/сохраняете пакетный файл @AmberCahill, делайте это с помощью редактора, который может сохранить скрипт с использованием целевой кодовой страницы, например. DOS/OEM 437. Когда файл сохраняется с использованием той же кодовой страницы, указанной в этом скрипте, все его символы должны воспроизводиться точно.
@AmberCahill Символы со значением кодовой точки от 0x00 до 0x1F являются управляющими символами в соответствии с ASCII. Пожалуйста, прочтите абзац над таблицей. Символ со значением 0x0D — это возврат каретки (CR), который представляет собой символ новой строки, существующий в конце каждой строки в пакетном файле вместе с символом новой строки перевода строки (0x0A, LF). cmd.exe
интерпретирует байт с шестнадцатеричным значением 0x0D не как восьмую ноту, а как возврат каретки.
Чтобы использовать символ ♪ в пакетном файле, необходимо сохранить файл в кодировке UTF-8.
Вы можете сделать это в большинстве текстовых редакторов, включая VS Code.
При запуске пакетного файла может потребоваться изменить кодовую страницу консоли на UTF-8, чтобы обеспечить правильное отображение символа.
Вы можете сделать это, добавив следующую строку в свой пакетный файл:
chcp 65001
Это изменит кодовую страницу консоли на UTF-8. После этого вы можете установить подсказку с помощью символа ♪ следующим образом:
prompt ♪$G
Это должно установить приглашение на ♪>.
Вам не нужно использовать шестнадцатеричный редактор.
Например, вы можете протестировать пакетный файл ниже:
@echo off & cls
Chcp 65001>nul
prompt ♪$G
CMD /K
@echo on
Этот пакетный файл настраивает командную строку с настраиваемым символом подсказки, а затем запускает новый экземпляр командной строки с переключателем /K
, который оставляет новое окно командной строки открытым после выполнения любых команд.
Вот разбивка команд:
@echo
off отключает отображение каждой команды в командной строке, чтобы они не отображались по мере их выполнения.cls
очищает экран командной строки.Chcp 65001
устанавливает кодовую страницу консоли в UTF-8, чтобы она могла отображать специальные символы, такие как символ музыкальной ноты (♪).prompt ♪$G
настраивает командную строку на отображение символа музыкальной ноты (♪), за которым следует символ «больше» (>) в качестве командной строки.CMD /K
запускает новый экземпляр командной строки и оставляет его открытым.@echo on
включает отображение каждой команды в новом окне командной строки.Редактировать :
@echo off
REM Get the current code page and save it in the ORIGINAL_CODEPAGE variable
for /F "tokens=*" %%A in ('%SystemRoot%\System32\chcp.com') do for %%B in (%%A) do set /A "ORIGINAL_CODEPAGE=%%~nB" 2>nul
REM Display the original code page to the user and wait for a key press
echo My default current page is :%ORIGINAL_CODEPAGE%
pause
REM Set the console code page to UTF-8 (65001) and wait for a key press
chcp 65001
pause
REM Set the command prompt to display a musical note (U+266A) followed by a greater-than symbol and wait for a key press
prompt ♪$G
pause
REM Restore the original code page and launch a new command prompt that inherits the current environment variables
chcp %ORIGINAL_CODEPAGE%
CMD /K
Изменение кодовой страницы консоли на UTF-8 (65001)
может вызвать проблемы при передаче текста между приложениями, использующими стандартную библиотеку C, поскольку некоторые из этих приложений могут не поддерживать кодировку UTF-8
.
Это может привести к неправильному отображению символов или их отсутствию.
Однако в пакетном файле, который я предоставил в разделе редактирования, исходная кодовая страница консоли сохраняется в начале пакетного файла, а затем восстанавливается в конце пакетного файла с помощью команды chcp
.
Это означает, что любые негативные побочные эффекты изменения кодовой страницы консоли на UTF-8
будут ограничены длительностью пакетного файла, а кодовая страница консоли будет восстановлена до исходного значения перед запуском новой командной строки.
Таким образом, пока вы используете кодовую страницу консоли UTF-8
только в самом пакетном файле и не передаете текст другим приложениям, которые не поддерживают UTF-8
, вы не должны испытывать никаких негативных побочных эффектов.
Сохранит ли этот подход кодовую страницу 65001? Я слышал, что использование только этой кодовой страницы имеет негативные побочные эффекты, особенно при передаче между приложениями, использующими стандартную библиотеку C.
@AmberCahill Проверьте мое последнее редактирование!
Hackoo абсолютно прав с информацией о том, что ♪
может вообще не отображаться. Подсказка отображается только с >
в Windows 7, потому что шрифт по умолчанию для окна консоли Windows — Raster Fonts
в Windows 7/Vista/XP, что означает OEM-шрифт Terminal
, который является растровым шрифтом (файл шрифта %SystemRoot%\Fonts\vga850.fon
в моем случае в Windows 7 ). Для восьмой ноты нет растрового изображения. Использование кодовой страницы или кодировки символов, поддерживающей этот символ, не означает, что сконфигурированный консольный шрифт также поддерживает этот символ.
В Windows 7 также доступен Consolas
, который является шрифтом окна консоли по умолчанию, начиная с Windows 8. Пакетный файл, опубликованный Hackoo, отображает приглашение с ♪>
, если я открою свойства окна консоли и изменю шрифт с Raster Fonts
на Consolas
. К сожалению, нет команды Windows для изменения шрифта консоли для активного окна консоли. Для максимальной совместимости окна консоли лучше избегать использования символов в кодировке UTF-8, таких как ♪
.
Пакетные файлы могут выполняться пользователем также из окна консоли PowerShell или окна терминала Windows, в котором шрифт и кодовая страница по умолчанию (кодировка символов) также отличаются от окна командной строки Windows. По этой причине я максимально избегаю пакетных файлов в кодировке UTF-8 при выполнении в неизвестной среде, когда другие люди выполняют их на своих компьютерах с Windows.
эти символы не существуют в CP437. Вам нужно использовать
chcp 65001
, чтобы переключиться на UTF-8 в начале и сохранить скрипт как UTF-8.