批处理脚本中的方框图字符 (Windows CMD)

2024-01-25

我想在批处理脚本中显示方框字符(单行或双行),这些脚本旨在在Windows CMD环境(XP、7、8和reactOS)上运行。这些“框”符号在代码页 1252 中指定。

从脚本中,我使用 CHCP 命令设置必要的代码 850 或 437。

chcp 437

为了写作,我正在使用 ECHO 命令

ECHO“要显示的字符”

我应该使用什么文件编码(ANSI、UTF8、..)?


Open a 命令提示符 https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/, run chcp(更改代码页)不带任何参数,Windows 命令处理器输出预期的字符编码的代码页cmd.exe根据为用于执行批处理文件的用户帐户配置的国家/地区解释批处理文件。

但是,可以使用例如chcp 437 >nul在批处理文件使用命令输出字符之前显式设置代码页 437echo。在这种情况下,批处理文件中的所有字符都应使用编码代码页 437 https://en.wikipedia.org/wiki/Code_page_437。北美国家(加拿大、美国)默认使用代码页 437,因此 Windows 控制台窗口默认使用的所有字体都支持代码页 437。

用于 Windows 控制台的另一个非常常见的代码页是代码页 850 https://en.wikipedia.org/wiki/Code_page_850与代码页 437 类似,但与代码页 437 相比,方框图字符较少。西欧国家/地区默认使用此代码页。 Windows 控制台窗口默认使用的所有字体也支持它。

关于代码页 437 和 850 的两个引用的维基百科页面显示了方框图字符及其十进制和十六进制代码值,每个字符使用一个字节进行编码,即使用“ANSI”编码。 “ANSI”在这里并不是一个真正正确的术语,因为代码页 437 和 850 是OEM 代码页 https://en.wikipedia.org/wiki/OEM_code_page那些没有被标准化的美国国家标准协会 https://en.wikipedia.org/wiki/American_National_Standards_Institute(ANSI)。但微软使用了这个词ANSI对全部字符编码 https://en.wikipedia.org/wiki/Character_encoding每个字符仅使用一个字节。

有关代码页 437 和 850 的维基百科页面还显示了批处理文件使用 UTF-8 编码时的 Unicode 代码值。但请注意,Windows 控制台窗口默认使用的一些字体,例如TerminalWindows 7 上默认使用的(光栅字体)不支持 UTF-8 编码。详情请看我的回答在为其他人制作的批处理文件中使用另一种语言(代码页) https://stackoverflow.com/a/48982681/3074564以及答案下面的评论。

我建议使用“ANSI”或更精确OEM批处理文件的字符编码echo输出用代码页 437 编码的框绘图字符的命令行。

对于北美和西欧国家/地区,Windows GUI 文本编辑器默认使用的“ANSI”编码是Windows-1252 https://en.wikipedia.org/wiki/Windows-1252。了解所使用的文本编辑器是否不支持使用代码页 437 解释字节来显示批处理文件内容可能很重要,因此有必要输入带有代码值的 Windows-1252 字符,从而导致显示使用 OEM 代码页 437 解释方框图字符。

某些编辑器(例如 UltraEdit)支持使用任何代码页显示每个字符一个字节编码的文本文件,只要配置的字体也支持此代码页即可。

字体Terminal在编写应输出方框图字符的批处理文件时,作为文本编辑器字体绝对是一个不错的选择。

Example:

批处理文件包含以下使用代码页 437 进行 OEM 编码的命令行:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=*" %%G in ('%SystemRoot%\System32\chcp.com') do for %%H in (%%G) do set /A "CodePage=%%H" 2>nul
%SystemRoot%\System32\chcp.com 437 >nul
echo ┌───────────────┐
echo │ box drawing 1 │
echo └───────────────┘
echo(
echo ╔═══════════════╗
echo ║ box drawing 2 ║
echo ╚═══════════════╝
%SystemRoot%\System32\chcp.com %CodePage% >nul
endlocal

该批处理文件包含以下字节(偏移量:十六进制字节;ASCII 表示):

0000h: 40 65 63 68 6F 20 6F 66 66 0D 0A 73 65 74 6C 6F ; @echo off..setlo
0010h: 63 61 6C 20 45 6E 61 62 6C 65 45 78 74 65 6E 73 ; cal EnableExtens
0020h: 69 6F 6E 73 20 44 69 73 61 62 6C 65 44 65 6C 61 ; ions DisableDela
0030h: 79 65 64 45 78 70 61 6E 73 69 6F 6E 0D 0A 66 6F ; yedExpansion..fo
0040h: 72 20 2F 46 20 22 74 6F 6B 65 6E 73 3D 2A 22 20 ; r /F "tokens=*" 
0050h: 25 25 47 20 69 6E 20 28 27 25 53 79 73 74 65 6D ; %%G in ('%System
0060h: 52 6F 6F 74 25 5C 53 79 73 74 65 6D 33 32 5C 63 ; Root%\System32\c
0070h: 68 63 70 2E 63 6F 6D 27 29 20 64 6F 20 66 6F 72 ; hcp.com') do for
0080h: 20 25 25 48 20 69 6E 20 28 25 25 47 29 20 64 6F ;  %%H in (%%G) do
0090h: 20 73 65 74 20 2F 41 20 22 43 6F 64 65 50 61 67 ;  set /A "CodePag
00a0h: 65 3D 25 25 48 22 20 32 3E 6E 75 6C 0D 0A 25 53 ; e=%%H" 2>nul..%S
00b0h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65 ; ystemRoot%\Syste
00c0h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 34 33 37 ; m32\chcp.com 437
00d0h: 20 3E 6E 75 6C 0D 0A 65 63 68 6F 20 DA C4 C4 C4 ;  >nul..echo ÚÄÄÄ
00e0h: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 BF 0D 0A 65 ; ÄÄÄÄÄÄÄÄÄÄÄÄ¿..e
00f0h: 63 68 6F 20 B3 20 62 6F 78 20 64 72 61 77 69 6E ; cho ³ box drawin
0100h: 67 20 31 20 B3 0D 0A 65 63 68 6F 20 C0 C4 C4 C4 ; g 1 ³..echo ÀÄÄÄ
0110h: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 D9 0D 0A 65 ; ÄÄÄÄÄÄÄÄÄÄÄÄÙ..e
0120h: 63 68 6F 28 0D 0A 65 63 68 6F 20 C9 CD CD CD CD ; cho(..echo ÉÍÍÍÍ
0130h: CD CD CD CD CD CD CD CD CD CD CD BB 0D 0A 65 63 ; ÍÍÍÍÍÍÍÍÍÍÍ»..ec
0140h: 68 6F 20 BA 20 62 6F 78 20 64 72 61 77 69 6E 67 ; ho º box drawing
0150h: 20 32 20 BA 0D 0A 65 63 68 6F 20 C8 CD CD CD CD ;  2 º..echo ÈÍÍÍÍ
0160h: CD CD CD CD CD CD CD CD CD CD CD BC 0D 0A 25 53 ; ÍÍÍÍÍÍÍÍÍÍͼ..%S
0170h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65 ; ystemRoot%\Syste
0180h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 25 43 6F ; m32\chcp.com %Co
0190h: 64 65 50 61 67 65 25 20 3E 6E 75 6C 0D 0A 65 6E ; dePage% >nul..en
01a0h: 64 6C 6F 63 61 6C 0D 0A                         ; dlocal..

字节的 ASCII 表示使用代码页 Windows-1252。因此,在这里可以看到,仅仅因为使用“ANSI”编码文本文件的不同代码页,相同的字节值就会导致显示不同的字符。

相同的批处理文件将包含没有字节顺序标记的 UTF-8 编码:

0000h: 40 65 63 68 6F 20 6F 66 66 0D 0A 73 65 74 6C 6F
0010h: 63 61 6C 20 45 6E 61 62 6C 65 45 78 74 65 6E 73
0020h: 69 6F 6E 73 20 44 69 73 61 62 6C 65 44 65 6C 61
0030h: 79 65 64 45 78 70 61 6E 73 69 6F 6E 0D 0A 66 6F
0040h: 72 20 2F 46 20 22 74 6F 6B 65 6E 73 3D 2A 22 20
0050h: 25 25 47 20 69 6E 20 28 27 25 53 79 73 74 65 6D
0060h: 52 6F 6F 74 25 5C 53 79 73 74 65 6D 33 32 5C 63
0070h: 68 63 70 2E 63 6F 6D 27 29 20 64 6F 20 66 6F 72
0080h: 20 25 25 48 20 69 6E 20 28 25 25 47 29 20 64 6F
0090h: 20 73 65 74 20 2F 41 20 22 43 6F 64 65 50 61 67
00a0h: 65 3D 25 25 48 22 20 32 3E 6E 75 6C 0D 0A 25 53
00b0h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65
00c0h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 34 33 37
00d0h: 20 3E 6E 75 6C 0D 0A 65 63 68 6F 20 E2 94 8C E2
00e0h: 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94
00f0h: 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80
0100h: E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 90 0D
0110h: 0A 65 63 68 6F 20 E2 94 82 20 62 6F 78 20 64 72
0120h: 61 77 69 6E 67 20 31 20 E2 94 82 0D 0A 65 63 68
0130h: 6F 20 E2 94 94 E2 94 80 E2 94 80 E2 94 80 E2 94
0140h: 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80
0150h: E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2
0160h: 94 80 E2 94 98 0D 0A 65 63 68 6F 28 0D 0A 65 63
0170h: 68 6F 20 E2 95 94 E2 95 90 E2 95 90 E2 95 90 E2
0180h: 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95
0190h: 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90
01a0h: E2 95 90 E2 95 97 0D 0A 65 63 68 6F 20 E2 95 91
01b0h: 20 62 6F 78 20 64 72 61 77 69 6E 67 20 32 20 E2
01c0h: 95 91 0D 0A 65 63 68 6F 20 E2 95 9A E2 95 90 E2
01d0h: 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95
01e0h: 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90
01f0h: E2 95 90 E2 95 90 E2 95 90 E2 95 9D 0D 0A 25 53
0200h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65
0210h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 25 43 6F
0220h: 64 65 50 61 67 65 25 20 3E 6E 75 6C 0D 0A 65 6E
0230h: 64 6C 6F 63 61 6C 0D 0A

Note:您的浏览器用于显示上述批处理文件代码的字体可能会导致两个框不显示为真正的封闭框,所有六行的宽度与在具有默认光栅的 Windows XP 和 Windows 7 的 Windows 控制台窗口中的宽度相同字体或带有字体露西达控制台默认情况下,它也可在 Windows 控制台窗口的属性中使用。露西达控制台支持的字符比Terminal,但它不是控制台窗口的默认字体。

文本编辑器 UltraEdit 有一个ASCII 表查看哪个字体Terminal可以设置为 OEM 字体。这使得输入显示在中的方框图字符变得非常容易ASCII 表用字体查看Terminal双击视图中的这些字符即可将其插入批处理文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批处理脚本中的方框图字符 (Windows CMD) 的相关文章

随机推荐