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

wgxvkvu9  于 2023-03-13  发布在  Windows
关注(0)|答案(2)|浏览(352)

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

从脚本我设置必要的代码850或437与CHCP命令。
氯化石蜡437
对于写入,我正在使用ECHO命令
ECHO“字符显示”
我应该使用什么文件编码(ANSI,UTF8,..)?

n3ipq98p

n3ipq98p1#

打开command prompt,在不使用任何参数的情况下运行chcp(更改代码页),Windows命令处理器在根据为用于执行批处理文件的用户帐户配置的国家解释批处理文件时输出cmd.exe预期的字符编码的代码页。
但是,在批处理文件使用命令echo输出字符之前,可以使用例如chcp 437 >nul显式设置代码页437。在这种情况下,批处理文件中的所有字符都应使用code page 437进行编码。默认情况下,北美国家/地区使用代码页437(加拿大、美国),因此Windows控制台窗口默认使用的所有字体都支持。
Windows控制台使用的另一个非常常见的代码页是code page 850,它类似于代码页437,但与代码页437相比,框绘制字符较少。西欧国家/地区默认使用此代码页。Windows控制台窗口默认使用的所有字体也支持此代码页。
关于代码页437和850的两个引用的Wikipedia页示出了方框图字符以及它们的十进制和十六进制代码值,即使用“ANSI”编码。“ANSI”在这里实际上不是一个正确的术语,因为代码页437和850是OEM code pages,它们没有被American National Standards Institute标准化但是微软使用术语ANSI来表示所有charater encodings,每个字符仅使用一个字节。
如果批处理文件使用UTF-8编码,则Wikipedia上关于代码页437和850的页面也会显示Unicode代码值。但请注意,Windows控制台窗口默认使用的一些字体,如Terminal(光栅字体)作为默认使用的Windows 7不支持UTF-8编码。有关详细信息,请参阅我的答案对Using another language (code page) in a batch file made for others和评论下面的答案。
我建议对带有echo命令行的批处理文件使用“ANSI”或更精确的OEM字符编码,该命令行输出用代码页437编码的框绘图字符。
北美和西欧国家的Windows GUI文本编辑器默认使用的“ANSI”编码是Windows-1252。了解所用的文本编辑器是否不支持显示批处理文件内容并使用代码页437解释字节可能很重要,因此必须输入Windows-1252个字符,其代码值导致在用OEM代码页437解释时显示方框图字符。
一些编辑器,如UltraEdit,支持显示每个字符一个字节的编码文本文件,只要配置的字体也支持此代码页。
字体终端绝对是一个很好的选择,作为文本编辑器字体写一个批处理文件,应输出框绘图字符。
示例:
批处理文件包含以下命令行OEM编码,代码页为437:

@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

注意:浏览器用于显示上述批处理文件代码的字体可能会导致两个框不能显示为真实的的封闭框,并且所有六行的宽度都相同,就像在Windows XP和Windows 7的Windows控制台窗口中使用默认光栅字体或字体Lucida Console(默认情况下也可在Windows控制台窗口的属性中使用)一样。Lucida Console支持的字符比Terminal多得多,但它不是控制台窗口的默认字体。

文本编辑器UltraEdit有一个ASCII表视图,可以为该视图设置字体终端(OEM字体)。这使得输入方框图字符非常容易,这些字符显示在ASCII表视图中,字体为终端,双击视图中的这些字符可以将其插入批处理文件。

42fyovps

42fyovps2#

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

AFAIK在这种情况下使用什么file编码并没有什么区别。编辑器使用的字符集才是最重要的。我使用的是Notepad++,需要设置“编码-〉字符集-〉西欧-〉OEM 850”-例如:

是否需要在批处理文件或cmd控制台中 chcp

如果你不需要所有的40个方框绘制字符,可以用22个字符来处理,通常是没有必要的(我不确定CMD的字符集是否以及如何受到西里尔文、日文或中文Windows版本/设置的影响)。

文字云

显示相同的ASCII字符编辑器记事本DOS cmd shell

相关问题