Cmd.exe интерпретирует ♪ как ? или ΓÖ¬ при чтении файла .bat на кодовой странице 437

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

ΓÖ¬>

Как я могу изменить подсказку на ♪> из пакетного файла? В какой кодировке сохранить файл? Нужно ли мне использовать шестнадцатеричный редактор каким-либо образом?

эти символы не существуют в CP437. Вам нужно использовать chcp 65001, чтобы переключиться на UTF-8 в начале и сохранить скрипт как UTF-8.

phuclv 14.02.2023 07:11

В статье Википедии о кодовой странице есть список всех кодовых страниц и ссылка на OEM кодовую страницу 437 и Windows-1252 . Обе кодовые страницы не содержат символ , поэтому Visual Studio Code сохранил пакетный файл в кодировке UTF-8.

Mofi 14.02.2023 08:09

@Mofi Статья в Википедии с кодовой страницей 437, на которую вы ссылаетесь, буквально содержит символ в позиции 0x0D

Amber Cahill 14.02.2023 09:52

Когда вы пишете/сохраняете пакетный файл @AmberCahill, делайте это с помощью редактора, который может сохранить скрипт с использованием целевой кодовой страницы, например. DOS/OEM 437. Когда файл сохраняется с использованием той же кодовой страницы, указанной в этом скрипте, все его символы должны воспроизводиться точно.

Compo 14.02.2023 11:41

@AmberCahill Символы со значением кодовой точки от 0x00 до 0x1F являются управляющими символами в соответствии с ASCII. Пожалуйста, прочтите абзац над таблицей. Символ со значением 0x0D — это возврат каретки (CR), который представляет собой символ новой строки, существующий в конце каждой строки в пакетном файле вместе с символом новой строки перевода строки (0x0A, LF). cmd.exe интерпретирует байт с шестнадцатеричным значением 0x0D не как восьмую ноту, а как возврат каретки.

Mofi 14.02.2023 15:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы использовать символ ♪ в пакетном файле, необходимо сохранить файл в кодировке 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, который оставляет новое окно командной строки открытым после выполнения любых команд.

Вот разбивка команд:

  1. @echo off отключает отображение каждой команды в командной строке, чтобы они не отображались по мере их выполнения.
  2. cls очищает экран командной строки.
  3. Chcp 65001 устанавливает кодовую страницу консоли в UTF-8, чтобы она могла отображать специальные символы, такие как символ музыкальной ноты (♪).
  4. prompt ♪$G настраивает командную строку на отображение символа музыкальной ноты (♪), за которым следует символ «больше» (>) в качестве командной строки.
  5. CMD /K запускает новый экземпляр командной строки и оставляет его открытым.
  6. @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.

Amber Cahill 14.02.2023 09:58

@AmberCahill Проверьте мое последнее редактирование!

Hackoo 14.02.2023 11:28

Hackoo абсолютно прав с информацией о том, что может вообще не отображаться. Подсказка отображается только с > в Windows 7, потому что шрифт по умолчанию для окна консоли Windows — Raster Fonts в Windows 7/Vista/XP, что означает OEM-шрифт Terminal, который является растровым шрифтом (файл шрифта %SystemRoot%\Fonts\vga850.fon в моем случае в Windows 7 ). Для восьмой ноты нет растрового изображения. Использование кодовой страницы или кодировки символов, поддерживающей этот символ, не означает, что сконфигурированный консольный шрифт также поддерживает этот символ.

Mofi 14.02.2023 15:47

В Windows 7 также доступен Consolas, который является шрифтом окна консоли по умолчанию, начиная с Windows 8. Пакетный файл, опубликованный Hackoo, отображает приглашение с ♪>, если я открою свойства окна консоли и изменю шрифт с Raster Fonts на Consolas. К сожалению, нет команды Windows для изменения шрифта консоли для активного окна консоли. Для максимальной совместимости окна консоли лучше избегать использования символов в кодировке UTF-8, таких как .

Mofi 14.02.2023 15:58

Пакетные файлы могут выполняться пользователем также из окна консоли PowerShell или окна терминала Windows, в котором шрифт и кодовая страница по умолчанию (кодировка символов) также отличаются от окна командной строки Windows. По этой причине я максимально избегаю пакетных файлов в кодировке UTF-8 при выполнении в неизвестной среде, когда другие люди выполняют их на своих компьютерах с Windows.

Mofi 14.02.2023 15:58

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