Dan*_*rez 5 windows cmd batch-file windows-console
我想在批处理脚本中显示方框字符(单行或双行),这些脚本旨在在Windows CMD环境(XP、7、8和reactOS)上运行。这些“框”符号在代码页 1252 中指定。
从脚本中,我使用 CHCP 命令设置必要的代码 850 或 437。
第 437 章
为了写作,我正在使用 ECHO 命令
ECHO“要显示的字符”
我应该使用什么文件编码(ANSI、UTF8、..)?
打开命令提示符,在不带任何参数的情况下运行(更改代码页),Windows 命令处理器根据为用于执行批处理文件的用户帐户配置的国家/地区,chcp输出解释批处理文件所需的字符编码的代码页。cmd.exe
但是,可以使用例如chcp 437 >nul在批处理文件使用 command 输出字符之前显式设置代码页 437 echo。在这种情况下,批处理文件中的所有字符都应使用代码页 437进行编码。北美国家(加拿大、美国)默认使用代码页 437,因此 Windows 控制台窗口默认使用的所有字体都支持代码页 437。
Windows 控制台使用的另一个非常常见的代码页是代码页 850,类似于 \xc2\xa0 代码页 437,但与代码页 437 相比,方框图字符较少。西欧国家/地区默认使用此代码页。Windows 控制台窗口默认使用的所有字体也支持它。
\n关于代码页 437 和 850 的两个引用的维基百科页面显示了方框图字符及其十进制和十六进制代码值,每个字符使用一个字节进行编码,即使用“ANSI”编码。“ANSI”在这里并不是一个真正正确的术语,因为代码页 437 和 850 是OEM 代码页,未由美国国家标准协会(ANSI) 标准化。但微软使用这个术语ANSI来表示所有字符编码,每个字符仅使用\xc2\xa0一个字节。
有关代码页 437 和 850 的维基百科页面还显示了批处理文件使用 UTF-8 编码时的 Unicode 代码值。但请注意,Windows 控制台窗口默认使用的某些字体(例如Windows 7 上默认使用的终端(光栅字体))不支持 UTF-8 编码。有关详细信息,请参阅我关于在为其他人制作的批处理文件中使用另一种语言(代码页)的答案以及答案下方的评论。
\nOEM我建议对带有命令行的批处理文件使用“ANSI”或更精确的字符编码echo,该批处理文件输出使用代码页 437 编码的框绘图字符。
北美和西欧国家/地区的 Windows GUI 文本编辑器默认使用的“ANSI”编码是Windows-1252。了解所使用的文本编辑器是否不支持使用代码页 437 解释字节来显示批处理文件内容可能很重要,因此有必要输入带有代码值的 Windows-1252 字符,从而导致显示使用 OEM 代码页 437 解释方框图字符。
\n某些编辑器(例如 UltraEdit)支持使用任何代码页显示每个字符一个字节编码的文本文件,只要配置的字体也支持此代码页即可。
\n在编写应输出方框图字符的批处理文件时,终端字体绝对是一个不错的选择作为文本编辑器字体。
\n例子:
\n批处理文件包含以下使用代码页 437 进行 OEM 编码的命令行:
\n@echo off\nsetlocal EnableExtensions DisableDelayedExpansion\nfor /F "tokens=*" %%G in (\'%SystemRoot%\\System32\\chcp.com\') do for %%H in (%%G) do set /A "CodePage=%%H" 2>nul\n%SystemRoot%\\System32\\chcp.com 437 >nul\necho \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\necho \xe2\x94\x82 box drawing 1 \xe2\x94\x82\necho \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\necho(\necho \xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\necho \xe2\x95\x91 box drawing 2 \xe2\x95\x91\necho \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n%SystemRoot%\\System32\\chcp.com %CodePage% >nul\nendlocal\nRun Code Online (Sandbox Code Playgroud)\n该批处理文件包含以下字节(偏移量:十六进制字节;ASCII 表示):
\n0000h: 40 65 63 68 6F 20 6F 66 66 0D 0A 73 65 74 6C 6F ; @echo off..setlo\n0010h: 63 61 6C 20 45 6E 61 62 6C 65 45 78 74 65 6E 73 ; cal EnableExtens\n0020h: 69 6F 6E 73 20 44 69 73 61 62 6C 65 44 65 6C 61 ; ions DisableDela\n0030h: 79 65 64 45 78 70 61 6E 73 69 6F 6E 0D 0A 66 6F ; yedExpansion..fo\n0040h: 72 20 2F 46 20 22 74 6F 6B 65 6E 73 3D 2A 22 20 ; r /F "tokens=*" \n0050h: 25 25 47 20 69 6E 20 28 27 25 53 79 73 74 65 6D ; %%G in (\'%System\n0060h: 52 6F 6F 74 25 5C 53 79 73 74 65 6D 33 32 5C 63 ; Root%\\System32\\c\n0070h: 68 63 70 2E 63 6F 6D 27 29 20 64 6F 20 66 6F 72 ; hcp.com\') do for\n0080h: 20 25 25 48 20 69 6E 20 28 25 25 47 29 20 64 6F ; %%H in (%%G) do\n0090h: 20 73 65 74 20 2F 41 20 22 43 6F 64 65 50 61 67 ; set /A "CodePag\n00a0h: 65 3D 25 25 48 22 20 32 3E 6E 75 6C 0D 0A 25 53 ; e=%%H" 2>nul..%S\n00b0h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65 ; ystemRoot%\\Syste\n00c0h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 34 33 37 ; m32\\chcp.com 437\n00d0h: 20 3E 6E 75 6C 0D 0A 65 63 68 6F 20 DA C4 C4 C4 ; >nul..echo \xc3\x9a\xc3\x84\xc3\x84\xc3\x84\n00e0h: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 BF 0D 0A 65 ; \xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc2\xbf..e\n00f0h: 63 68 6F 20 B3 20 62 6F 78 20 64 72 61 77 69 6E ; cho \xc2\xb3 box drawin\n0100h: 67 20 31 20 B3 0D 0A 65 63 68 6F 20 C0 C4 C4 C4 ; g 1 \xc2\xb3..echo \xc3\x80\xc3\x84\xc3\x84\xc3\x84\n0110h: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 D9 0D 0A 65 ; \xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x84\xc3\x99..e\n0120h: 63 68 6F 28 0D 0A 65 63 68 6F 20 C9 CD CD CD CD ; cho(..echo \xc3\x89\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\n0130h: CD CD CD CD CD CD CD CD CD CD CD BB 0D 0A 65 63 ; \xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc2\xbb..ec\n0140h: 68 6F 20 BA 20 62 6F 78 20 64 72 61 77 69 6E 67 ; ho \xc2\xba box drawing\n0150h: 20 32 20 BA 0D 0A 65 63 68 6F 20 C8 CD CD CD CD ; 2 \xc2\xba..echo \xc3\x88\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\n0160h: CD CD CD CD CD CD CD CD CD CD CD BC 0D 0A 25 53 ; \xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc3\x8d\xc2\xbc..%S\n0170h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65 ; ystemRoot%\\Syste\n0180h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 25 43 6F ; m32\\chcp.com %Co\n0190h: 64 65 50 61 67 65 25 20 3E 6E 75 6C 0D 0A 65 6E ; dePage% >nul..en\n01a0h: 64 6C 6F 63 61 6C 0D 0A ; dlocal..\nRun Code Online (Sandbox Code Playgroud)\n字节的 ASCII 表示使用代码页 Windows-1252。因此,在这里可以看到,仅仅因为使用“ANSI”编码文本文件的不同代码页,相同的字节值就会导致显示不同的字符。
\n相同的批处理文件将包含没有字节顺序标记的 UTF-8 编码:
\n0000h: 40 65 63 68 6F 20 6F 66 66 0D 0A 73 65 74 6C 6F\n0010h: 63 61 6C 20 45 6E 61 62 6C 65 45 78 74 65 6E 73\n0020h: 69 6F 6E 73 20 44 69 73 61 62 6C 65 44 65 6C 61\n0030h: 79 65 64 45 78 70 61 6E 73 69 6F 6E 0D 0A 66 6F\n0040h: 72 20 2F 46 20 22 74 6F 6B 65 6E 73 3D 2A 22 20\n0050h: 25 25 47 20 69 6E 20 28 27 25 53 79 73 74 65 6D\n0060h: 52 6F 6F 74 25 5C 53 79 73 74 65 6D 33 32 5C 63\n0070h: 68 63 70 2E 63 6F 6D 27 29 20 64 6F 20 66 6F 72\n0080h: 20 25 25 48 20 69 6E 20 28 25 25 47 29 20 64 6F\n0090h: 20 73 65 74 20 2F 41 20 22 43 6F 64 65 50 61 67\n00a0h: 65 3D 25 25 48 22 20 32 3E 6E 75 6C 0D 0A 25 53\n00b0h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65\n00c0h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 34 33 37\n00d0h: 20 3E 6E 75 6C 0D 0A 65 63 68 6F 20 E2 94 8C E2\n00e0h: 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94\n00f0h: 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80\n0100h: E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 90 0D\n0110h: 0A 65 63 68 6F 20 E2 94 82 20 62 6F 78 20 64 72\n0120h: 61 77 69 6E 67 20 31 20 E2 94 82 0D 0A 65 63 68\n0130h: 6F 20 E2 94 94 E2 94 80 E2 94 80 E2 94 80 E2 94\n0140h: 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80\n0150h: E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2 94 80 E2\n0160h: 94 80 E2 94 98 0D 0A 65 63 68 6F 28 0D 0A 65 63\n0170h: 68 6F 20 E2 95 94 E2 95 90 E2 95 90 E2 95 90 E2\n0180h: 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95\n0190h: 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90\n01a0h: E2 95 90 E2 95 97 0D 0A 65 63 68 6F 20 E2 95 91\n01b0h: 20 62 6F 78 20 64 72 61 77 69 6E 67 20 32 20 E2\n01c0h: 95 91 0D 0A 65 63 68 6F 20 E2 95 9A E2 95 90 E2\n01d0h: 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95\n01e0h: 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90 E2 95 90\n01f0h: E2 95 90 E2 95 90 E2 95 90 E2 95 9D 0D 0A 25 53\n0200h: 79 73 74 65 6D 52 6F 6F 74 25 5C 53 79 73 74 65\n0210h: 6D 33 32 5C 63 68 63 70 2E 63 6F 6D 20 25 43 6F\n0220h: 64 65 50 61 67 65 25 20 3E 6E 75 6C 0D 0A 65 6E\n0230h: 64 6C 6F 63 61 6C 0D 0A\nRun Code Online (Sandbox Code Playgroud)\n注意:浏览器用于显示上述批处理文件代码的字体可能会导致 \xc2\xa0 两个框未显示为真正的封闭框,所有六行的宽度与 Windows XP 的 Windows 控制台窗口中的宽度相同, Windows 7 具有默认光栅字体或Lucida Console字体,默认情况下也可在 Windows 控制台窗口的属性中使用。Lucida Console支持比Terminal更多的字符,但它不是控制台窗口的默认字体。
\n文本编辑器 UltraEdit 有一个ASCII 表视图,可以为其设置字体Terminal ,即 \xc2\xa0an OEM 字体。这使得输入框绘图字符变得非常容易,这些字符显示在带有Terminal字体的 \xc2\xa0 ASCII 表视图中,并且可以通过双击视图中的这些字符将其插入到批处理文件中。
\n| 归档时间: |
|
| 查看次数: |
7774 次 |
| 最近记录: |