Как вставить юникод в Cmd/Batch?

Вопрос или проблема

Итак, я пытаюсь создать красивое пакетное меню, но каждый раз, когда я пытаюсь использовать красивые линии юникода, я просто получаю случайные символы. Есть ли способ вставить юникод в командную строку или пакетный файл?

Чтобы использовать юникод, добавьте код chcp 65001

Это изменит кодовую страницу. Она останется такой, пока вы не закроете окно.

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

Вы можете создавать юникодные символы из кодовых точек непосредственно в пакетном файле.

@echo off
setlocal
chcp 65001 >NUL

call :createUnicodeChar "U+20AC"
call :createUnicodeChar "U+10437"
call :createUnicodeChar "U+10400"
call :createUnicodeChar "U+1F609" smiley
echo %smiley% .. %smiley%
exit /b

:createUnicodeChar
setlocal EnableDelayedExpansion
set "code_point=%~1"
set "code_point=!code_point:U+=!"
set /a code_point=0x!code_point!

if !code_point! LSS 0x10000 (
    call :dec2hex_le !code_point! utf16_le_bytes
) ELSE (
    set /a "code_point-=0x10000"
    set /a "W1_val=((code_point >> 10) & 0x3FF) | 0xD800"
    set /a "W2_val=(code_point & 0x3FF) | 0xDC00"
    call :dec2hex_le !W1_val! W1_hex
    call :dec2hex_le !W2_val! W2_hex
    set "utf16_le_bytes=!W1_hex! !W2_hex!"
)

> "!TEMP!\utf16-LE.tmp" (echo ff fe !utf16_le_bytes!)

rem *** Декодировать файл в бинарный
> nul CertUtil -f -decodehex "!TEMP!\utf16-LE.tmp" "!TEMP!\utf16-LE.tmp"

for /F %%C in ('type "!TEMP!\utf16-LE.tmp"') do if "%~2" == "" (
    echo(%%C
) ELSE (
    endlocal
    set "%~2=%%C"
)
exit /b

:dec2hex_le
set "hex=0123456789ABCDEF"
set val=%1
set "res="
set /a "val|=0x10000"

:dec2hex_le_loop
set /a "nibble=val & 0x0F"
set /a "val>>=4"
set "res=!hex:~%nibble%,1!!res!"
if !val! GTR 1 goto :dec2hex_le_loop
set "%2=!res:~2,4! !res:~0,2!"
exit /b

Вывод:


𐐷
𐐀
😉 .. 😉

.

Ответ или решение

Чтобы использовать символы Юникода в командной строке Windows (Cmd) или в пакетном файле (Batch), требуется выполнить несколько шагов. Эти рекомендации позволят вам избежать появления случайных символов и отобразить «красивые» линии и другие специальные символы. Рассмотрим этот процесс подробнее.

Шаг 1: Изменение кодовой страницы

Для начала вам нужно изменить кодовую страницу на UTF-8, что позволит вашей командной строке обрабатывать символы Юникода. Для этого используйте следующую команду:

chcp 65001

Эта команда устанавливает кодовую страницу 65001 (UTF-8). Обратите внимание, что изменение кодовой страницы будет действовать только до закрытия окна командной строки.

Шаг 2: Автоматизация изменения кодовой страницы (по желанию)

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

  1. Откройте редактор реестра (regedit).
  2. Перейдите к следующему пути:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
  3. Создайте новую строковую переменную (REG_SZ) с именем AutoRun.
  4. Установите значение переменной на:
    chcp 65001

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

@chcp 65001 >nul

Шаг 3: Создание символов Юникода из кодовых точек

Вы также можете создать символы Юникода, используя кодовые точки непосредственно в вашем пакетном файле. Ниже приведён пример скрипта, который включает создание символов Юникода и их отображение:

@echo off
setlocal
chcp 65001 >NUL

call :createUnicodeChar "U+20AC"   ; Euro
call :createUnicodeChar "U+10437"   ; Glagolitic capital letter
call :createUnicodeChar "U+10400"   ; Linear B syllable
call :createUnicodeChar "U+1F609"    smiley  ; Winking face

echo %smiley% .. %smiley%
exit /b

:createUnicodeChar
setlocal EnableDelayedExpansion
set "code_point=%~1"
set "code_point=!code_point:U+=!"
set /a code_point=0x!code_point!

if !code_point! LSS 0x10000 (
    call :dec2hex_le !code_point! utf16_le_bytes
) ELSE (
    set /a "code_point-=0x10000"
    set /a "W1_val=((code_point >> 10) & 0x3FF) | 0xD800"
    set /a "W2_val=(code_point & 0x3FF) | 0xDC00"
    call :dec2hex_le !W1_val! W1_hex
    call :dec2hex_le !W2_val! W2_hex
    set "utf16_le_bytes=!W1_hex! !W2_hex!"
)

> "!TEMP!\utf16-LE.tmp" (echo ff fe !utf16_le_bytes!)

rem *** Decode file to binary
> nul CertUtil -f -decodehex "!TEMP!\utf16-LE.tmp" "!TEMP!\utf16-LE.tmp"

for /F %%C in ('type "!TEMP!\utf16-LE.tmp"') do if "%~2" == "" (
    echo(%%C
) ELSE (
    endlocal
    set "%~2=%%C"
)
exit /b

:dec2hex_le
set "hex=0123456789ABCDEF"
set val=%1
set "res="
set /a "val|=0x10000"

:dec2hex_le_loop
set /a "nibble=val & 0x0F"
set /a "val>>=4"
set "res=!hex:~%nibble%,1!!res!"
if !val! GTR 1 goto :dec2hex_le_loop
set "%2=!res:~2,4! !res:~0,2!"
exit /b

Выходной результат

При выполнении этого сценария вы получите следующий вывод с символами Юникода:

€  ; 𐐷  ; 𐐀  ; 😉 .. 😉

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...