Joe*_*101 4 windows batch-file character-encoding windows-console
因此,我不久前正在开发一个批处理文件游戏,由于某种原因,它打印了一个问号符号而不是笑脸符号(当您在命令提示符中按 Ctrl+A 时会得到该符号)。
我对其他符号也有同样的问题:
ctrl+a Smiley face
ctrl+b Dark smiley face
ctrl+d Diamond
ctrl+e Clover
ctrl+f Ace
ctrl+n Music symbol
crtl+o Some random circlish symbol
ctrl+p Left arrow
ctrl+q Right arrow
ctrl+r Up and Down arrows
ctrl+t Line wrap symbol
ctrl+u Double s
ctrl+v Thick underscore
ctrl+w Up and down arrow with a line at the bottom
ctrl+x Up arrow
ctrl+y Down arrow
Run Code Online (Sandbox Code Playgroud)
来源自 Instructables 文章:How do you usespecialchars in cmd
我目前运行的是带有最新更新的 Windows 10 Pro。我试图找到解决这个问题的方法,但没有成功。任何帮助,将不胜感激。
OEM Alt 代码的行为对于代码 1-31 和 127 具有误导性。系统的 OEM 代码页是 ASCII 的超集。但是,此范围的 Alt 代码不输入 ASCII 控制字符,而是输入旧 IBM PC 系统有时会显示和打印的 ASCII 控制字符。例如,按 Alt+1 输入“\xe2\x98\xba”(U+263A,白色笑脸)而不是 ASCII SOH(U+0001,标题开头)。更重要的是,WideCharToMultiByte
将此类字符编码为 OEM 代码页时的默认行为是使用相应的 ASCII 控制字符作为最适合的字符编码。因此,文本编辑器可能不会警告您所看到的并非您将得到的。
控制台不会将控制字符显示为旧 IBM PC 图形字符。它解释其中一些,例如U+0009(水平制表符——将光标前进8个空格)和U+000D(回车——将光标前进到下一行的开头),但大多数都显示为未映射字符的当前字体字形,例如带框的问号或空框。如果您想将“\xe2\x98\xba”打印到控制台,那么您应该使用控制台的宽字符 API,它适用于 Windows 本机 Unicode (UTF-16LE) 字符串。
\n\n幸运的是,CMD 是一个 Unicode 应用程序,因此将“\xe2\x98\xba”打印到控制台没有问题。问题是批处理脚本使用什么编码。唯一通用的解决方案是将批处理文件保存为不带 BOM(字节顺序标记)的 UTF-8。您需要一个可以保存没有 BOM 的 UTF-8 的 IDE 或文本编辑器,例如 Notepad++。
\n\nCMD 使用旧版控制台代码页逐行解码批处理脚本,您可以使用命令将其更改为 UTF-8 chcp.com 65001
。我建议不要永久更改为 UTF-8,因为根据 Windows 版本,控制台存在代码页 65001 的各种错误。您可以临时切换到 UTF-8 以将非 ASCII 字符串加载为环境变量。否则,将批处理文件的其余部分保留为严格的 7 位 ASCII 以避免本地化问题。
这是一个例子。可能有一种比创建所有这些本地环境变量更通用的方法来解决这个问题,但这只是为了表明它原则上是有效的。
\n\n图形控制文件
\n\n@echo off\nREM ASCII Control-Character Graphics\nREM File encoding: UTF-8 (no BOM)\n\nREM Set the console to codepage 65001 (UTF-8).\nfor /f "tokens=2 delims=:" %%a in (\'chcp.com\') do set "CONSOLE_CODEPAGE=%%a"\nset "CONSOLE_CODEPAGE=%CONSOLE_CODEPAGE: =%"\nchcp.com 65001 >NUL\n\nset "GCTL_WHITE_SMILING_FACE=\xe2\x98\xba"\nset "GCTL_BLACK_SMILING_FACE=\xe2\x98\xbb"\nset "GCTL_BLACK_HEART_SUIT=\xe2\x99\xa5"\nset "GCTL_BLACK_DIAMOND_SUIT=\xe2\x99\xa6"\nset "GCTL_BLACK_CLUB_SUIT=\xe2\x99\xa3"\nset "GCTL_BLACK_SPADE_SUIT=\xe2\x99\xa0"\nset "GCTL_BULLET=\xe2\x80\xa2"\nset "GCTL_INVERSE_BULLET=\xe2\x97\x98"\nset "GCTL_WHITE_CIRCLE=\xe2\x97\x8b"\nset "GCTL_INVERSE_WHITE_CIRCLE=\xe2\x97\x99"\nset "GCTL_MALE_SIGN=\xe2\x99\x82"\nset "GCTL_FEMALE_SIGN=\xe2\x99\x80"\nset "GCTL_EIGHTH_NOTE=\xe2\x99\xaa"\nset "GCTL_BEAMED_EIGHTH_NOTES=\xe2\x99\xab"\nset "GCTL_WHITE_SUN_WITH_RAYS=\xe2\x98\xbc"\nset "GCTL_BLACK_RIGHT_POINTER=\xe2\x96\xba"\nset "GCTL_BLACK_LEFT_POINTER=\xe2\x97\x84"\nset "GCTL_UP_DOWN_ARROW=\xe2\x86\x95"\nset "GCTL_DOUBLE_EXCLAMATION_MARK=\xe2\x80\xbc"\nset "GCTL_PILCROW_SIGN=\xc2\xb6"\nset "GCTL_SECTION_SIGN=\xc2\xa7"\nset "GCTL_BLACK_RECTANGLE=\xe2\x96\xac"\nset "GCTL_UP_DOWN_ARROW_WITH_BASE=\xe2\x86\xa8"\nset "GCTL_UP_ARROW=\xe2\x86\x91"\nset "GCTL_DOWN_ARROW=\xe2\x86\x93"\nset "GCTL_RIGHT_ARROW=\xe2\x86\x92"\nset "GCTL_LEFT_ARROW=\xe2\x86\x90"\nset "GCTL_RIGHT_ANGLE=\xe2\x88\x9f"\nset "GCTL_LEFT_RIGHT_ARROW=\xe2\x86\x94"\nset "GCTL_BLACK_UP_TRIANGLE=\xe2\x96\xb2"\nset "GCTL_BLACK_DOWN_TRIANGLE=\xe2\x96\xbc"\nset "GCTL_HOUSE=\xe2\x8c\x82"\n\nREM Restore the previous console codepage.\nchcp.com %CONSOLE_CODEPAGE% >NUL\n
Run Code Online (Sandbox Code Playgroud)\n\n图形框.bat
\n\n@echo off\nREM Box-Drawing Graphics\nREM File encoding: UTF-8 (no BOM)\n\nREM Set the console to codepage 65001 (UTF-8).\nfor /f "tokens=2 delims=:" %%a in (\'chcp.com\') do set "CONSOLE_CODEPAGE=%%a"\nset "CONSOLE_CODEPAGE=%CONSOLE_CODEPAGE: =%"\nchcp.com 65001 >NUL\n\nset "GBOX_LIGHT_SHADE=\xe2\x96\x91"\nset "GBOX_MEDIUM_SHADE=\xe2\x96\x92"\nset "GBOX_DARK_SHADE=\xe2\x96\x93"\nset "GBOX_LIGHT_VERTICAL=\xe2\x94\x82"\nset "GBOX_LIGHT_VERTICAL_AND_LEFT=\xe2\x94\xa4"\nset "GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE=\xe2\x95\xa1"\nset "GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE=\xe2\x95\xa2"\nset "GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE=\xe2\x95\x96"\nset "GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE=\xe2\x95\x95"\nset "GBOX_DOUBLE_VERTICAL_AND_LEFT=\xe2\x95\xa3"\nset "GBOX_DOUBLE_VERTICAL=\xe2\x95\x91"\nset "GBOX_DOUBLE_DOWN_AND_LEFT=\xe2\x95\x97"\nset "GBOX_DOUBLE_UP_AND_LEFT=\xe2\x95\x9d"\nset "GBOX_UP_DOUBLE_AND_LEFT_SINGLE=\xe2\x95\x9c"\nset "GBOX_UP_SINGLE_AND_LEFT_DOUBLE=\xe2\x95\x9b"\nset "GBOX_LIGHT_DOWN_AND_LEFT=\xe2\x94\x90"\nset "GBOX_LIGHT_UP_AND_RIGHT=\xe2\x94\x94"\nset "GBOX_LIGHT_UP_AND_HORIZONTAL=\xe2\x94\xb4"\nset "GBOX_LIGHT_DOWN_AND_HORIZONTAL=\xe2\x94\xac"\nset "GBOX_LIGHT_VERTICAL_AND_RIGHT=\xe2\x94\x9c"\nset "GBOX_LIGHT_HORIZONTAL=\xe2\x94\x80"\nset "GBOX_LIGHT_VERTICAL_AND_HORIZONTAL=\xe2\x94\xbc"\nset "GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE=\xe2\x95\x9e"\nset "GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE=\xe2\x95\x9f"\nset "GBOX_DOUBLE_UP_AND_RIGHT=\xe2\x95\x9a"\nset "GBOX_DOUBLE_DOWN_AND_RIGHT=\xe2\x95\x94"\nset "GBOX_DOUBLE_UP_AND_HORIZONTAL=\xe2\x95\xa9"\nset "GBOX_DOUBLE_DOWN_AND_HORIZONTAL=\xe2\x95\xa6"\nset "GBOX_DOUBLE_VERTICAL_AND_RIGHT=\xe2\x95\xa0"\nset "GBOX_DOUBLE_HORIZONTAL=\xe2\x95\x90"\nset "GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL=\xe2\x95\xac"\nset "GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE=\xe2\x95\xa7"\nset "GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE=\xe2\x95\xa8"\nset "GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE=\xe2\x95\xa4"\nset "GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE=\xe2\x95\xa5"\nset "GBOX_UP_DOUBLE_AND_RIGHT_SINGLE=\xe2\x95\x99"\nset "GBOX_UP_SINGLE_AND_RIGHT_DOUBLE=\xe2\x95\x98"\nset "GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE=\xe2\x95\x92"\nset "GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE=\xe2\x95\x93"\nset "GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE=\xe2\x95\xab"\nset "GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE=\xe2\x95\xaa"\nset "GBOX_LIGHT_UP_AND_LEFT=\xe2\x94\x98"\nset "GBOX_LIGHT_DOWN_AND_RIGHT=\xe2\x94\x8c"\nset "GBOX_FULL_BLOCK=\xe2\x96\x88"\nset "GBOX_LOWER_HALF_BLOCK=\xe2\x96\x84"\nset "GBOX_LEFT_HALF_BLOCK=\xe2\x96\x8c"\nset "GBOX_RIGHT_HALF_BLOCK=\xe2\x96\x90"\nset "GBOX_UPPER_HALF_BLOCK=\xe2\x96\x80"\n\nREM Restore the previous console codepage.\nchcp.com %CONSOLE_CODEPAGE% >NUL\n
Run Code Online (Sandbox Code Playgroud)\n\n图形测试.bat
\n\n@echo off\nsetlocal\n\nset "scriptdir=%~dp0"\ncall "%scriptdir%\\graphics_ctl.bat"\ncall "%scriptdir%\\graphics_box.bat"\n\necho.\necho ASCII Control-Character Graphics\necho ----------------------------------------------\necho GCTL_WHITE_SMILING_FACE = %GCTL_WHITE_SMILING_FACE%\necho GCTL_BLACK_SMILING_FACE = %GCTL_BLACK_SMILING_FACE%\necho GCTL_BLACK_HEART_SUIT = %GCTL_BLACK_HEART_SUIT%\necho GCTL_BLACK_DIAMOND_SUIT = %GCTL_BLACK_DIAMOND_SUIT%\necho GCTL_BLACK_CLUB_SUIT = %GCTL_BLACK_CLUB_SUIT%\necho GCTL_BLACK_SPADE_SUIT = %GCTL_BLACK_SPADE_SUIT%\necho GCTL_BULLET = %GCTL_BULLET%\necho GCTL_INVERSE_BULLET = %GCTL_INVERSE_BULLET%\necho GCTL_WHITE_CIRCLE = %GCTL_WHITE_CIRCLE%\necho GCTL_INVERSE_WHITE_CIRCLE = %GCTL_INVERSE_WHITE_CIRCLE%\necho GCTL_MALE_SIGN = %GCTL_MALE_SIGN%\necho GCTL_FEMALE_SIGN = %GCTL_FEMALE_SIGN%\necho GCTL_EIGHTH_NOTE = %GCTL_EIGHTH_NOTE%\necho GCTL_BEAMED_EIGHTH_NOTES = %GCTL_BEAMED_EIGHTH_NOTES%\necho GCTL_WHITE_SUN_WITH_RAYS = %GCTL_WHITE_SUN_WITH_RAYS%\necho GCTL_BLACK_RIGHT_POINTER = %GCTL_BLACK_RIGHT_POINTER%\necho GCTL_BLACK_LEFT_POINTER = %GCTL_BLACK_LEFT_POINTER%\necho GCTL_UP_DOWN_ARROW = %GCTL_UP_DOWN_ARROW%\necho GCTL_DOUBLE_EXCLAMATION_MARK = %GCTL_DOUBLE_EXCLAMATION_MARK%\necho GCTL_PILCROW_SIGN = %GCTL_PILCROW_SIGN%\necho GCTL_SECTION_SIGN = %GCTL_SECTION_SIGN%\necho GCTL_BLACK_RECTANGLE = %GCTL_BLACK_RECTANGLE%\necho GCTL_UP_DOWN_ARROW_WITH_BASE = %GCTL_UP_DOWN_ARROW_WITH_BASE%\necho GCTL_UP_ARROW = %GCTL_UP_ARROW%\necho GCTL_DOWN_ARROW = %GCTL_DOWN_ARROW%\necho GCTL_RIGHT_ARROW = %GCTL_RIGHT_ARROW%\necho GCTL_LEFT_ARROW = %GCTL_LEFT_ARROW%\necho GCTL_RIGHT_ANGLE = %GCTL_RIGHT_ANGLE%\necho GCTL_LEFT_RIGHT_ARROW = %GCTL_LEFT_RIGHT_ARROW%\necho GCTL_BLACK_UP_TRIANGLE = %GCTL_BLACK_UP_TRIANGLE%\necho GCTL_BLACK_DOWN_TRIANGLE = %GCTL_BLACK_DOWN_TRIANGLE%\necho GCTL_HOUSE = %GCTL_HOUSE%\n\necho.\necho Box-Drawing Graphics\necho ----------------------------------------------\necho GBOX_LIGHT_SHADE = %GBOX_LIGHT_SHADE%\necho GBOX_MEDIUM_SHADE = %GBOX_MEDIUM_SHADE%\necho GBOX_DARK_SHADE = %GBOX_DARK_SHADE%\necho GBOX_LIGHT_VERTICAL = %GBOX_LIGHT_VERTICAL%\necho GBOX_LIGHT_VERTICAL_AND_LEFT = %GBOX_LIGHT_VERTICAL_AND_LEFT%\necho GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE = %GBOX_VERTICAL_SINGLE_AND_LEFT_DOUBLE%\necho GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE = %GBOX_VERTICAL_DOUBLE_AND_LEFT_SINGLE%\necho GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE = %GBOX_DOWN_DOUBLE_AND_LEFT_SINGLE%\necho GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE = %GBOX_DOWN_SINGLE_AND_LEFT_DOUBLE%\necho GBOX_DOUBLE_VERTICAL_AND_LEFT = %GBOX_DOUBLE_VERTICAL_AND_LEFT%\necho GBOX_DOUBLE_VERTICAL = %GBOX_DOUBLE_VERTICAL%\necho GBOX_DOUBLE_DOWN_AND_LEFT = %GBOX_DOUBLE_DOWN_AND_LEFT%\necho GBOX_DOUBLE_UP_AND_LEFT = %GBOX_DOUBLE_UP_AND_LEFT%\necho GBOX_UP_DOUBLE_AND_LEFT_SINGLE = %GBOX_UP_DOUBLE_AND_LEFT_SINGLE%\necho GBOX_UP_SINGLE_AND_LEFT_DOUBLE = %GBOX_UP_SINGLE_AND_LEFT_DOUBLE%\necho GBOX_LIGHT_DOWN_AND_LEFT = %GBOX_LIGHT_DOWN_AND_LEFT%\necho GBOX_LIGHT_UP_AND_RIGHT = %GBOX_LIGHT_UP_AND_RIGHT%\necho GBOX_LIGHT_UP_AND_HORIZONTAL = %GBOX_LIGHT_UP_AND_HORIZONTAL%\necho GBOX_LIGHT_DOWN_AND_HORIZONTAL = %GBOX_LIGHT_DOWN_AND_HORIZONTAL%\necho GBOX_LIGHT_VERTICAL_AND_RIGHT = %GBOX_LIGHT_VERTICAL_AND_RIGHT%\necho GBOX_LIGHT_HORIZONTAL = %GBOX_LIGHT_HORIZONTAL%\necho GBOX_LIGHT_VERTICAL_AND_HORIZONTAL = %GBOX_LIGHT_VERTICAL_AND_HORIZONTAL%\necho GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE = %GBOX_VERTICAL_SINGLE_AND_RIGHT_DOUBLE%\necho GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE = %GBOX_VERTICAL_DOUBLE_AND_RIGHT_SINGLE%\necho GBOX_DOUBLE_UP_AND_RIGHT = %GBOX_DOUBLE_UP_AND_RIGHT%\necho GBOX_DOUBLE_DOWN_AND_RIGHT = %GBOX_DOUBLE_DOWN_AND_RIGHT%\necho GBOX_DOUBLE_UP_AND_HORIZONTAL = %GBOX_DOUBLE_UP_AND_HORIZONTAL%\necho GBOX_DOUBLE_DOWN_AND_HORIZONTAL = %GBOX_DOUBLE_DOWN_AND_HORIZONTAL%\necho GBOX_DOUBLE_VERTICAL_AND_RIGHT = %GBOX_DOUBLE_VERTICAL_AND_RIGHT%\necho GBOX_DOUBLE_HORIZONTAL = %GBOX_DOUBLE_HORIZONTAL%\necho GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL = %GBOX_DOUBLE_VERTICAL_AND_HORIZONTAL%\necho GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE = %GBOX_UP_SINGLE_AND_HORIZONTAL_DOUBLE%\necho GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE = %GBOX_UP_DOUBLE_AND_HORIZONTAL_SINGLE%\necho GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE = %GBOX_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE%\necho GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE = %GBOX_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE%\necho GBOX_UP_DOUBLE_AND_RIGHT_SINGLE = %GBOX_UP_DOUBLE_AND_RIGHT_SINGLE%\necho GBOX_UP_SINGLE_AND_RIGHT_DOUBLE = %GBOX_UP_SINGLE_AND_RIGHT_DOUBLE%\necho GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE = %GBOX_DOWN_SINGLE_AND_RIGHT_DOUBLE%\necho GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE = %GBOX_DOWN_DOUBLE_AND_RIGHT_SINGLE%\necho GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE = %GBOX_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE%\necho GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE = %GBOX_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE%\necho GBOX_LIGHT_UP_AND_LEFT = %GBOX_LIGHT_UP_AND_LEFT%\necho GBOX_LIGHT_DOWN_AND_RIGHT = %GBOX_LIGHT_DOWN_AND_RIGHT%\necho GBOX_FULL_BLOCK = %GBOX_FULL_BLOCK%\necho GBOX_LOWER_HALF_BLOCK = %GBOX_LOWER_HALF_BLOCK%\necho GBOX_LEFT_HALF_BLOCK = %GBOX_LEFT_HALF_BLOCK%\necho GBOX_RIGHT_HALF_BLOCK = %GBOX_RIGHT_HALF_BLOCK%\necho GBOX_UPPER_HALF_BLOCK = %GBOX_UPPER_HALF_BLOCK%\n
Run Code Online (Sandbox Code Playgroud)\n