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

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

enter image description here

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

chcp 437

写入时,我使用ECHO命令。

ECHO "要显示的字符"

我应该使用哪种文件编码(ANSI,UTF8等)?


1
欢迎来到SO @DanielPerez。也许您还没有机会了解SO的工作方式,可以提出哪些问题以及如何提出好问题。请查看https://stackoverflow.com/help。通常不包含代码的问题会被发送到https://superuser.com/。 - lit
我改进了这个问题,但是打印代码非常基础,只有ECHO命令和要显示的内容。然而,我无法粘贴内容,因为问题的一部分是在Windows应用程序中编写和显示这些扩展字符并不容易。 - Daniel Perez
丹尼尔,我不明白为什么你向我们展示了一些可在代码页“1252”下使用的字符图像,然后将你的代码页设置为“850”或“437”。当你使用携带所需字符集的代码页时会发生什么? - Compo
如果您使用Windows记事本编辑器和代码页437或850,则需要使用此命令:echo Ú¿ ÃÅ´ ÀÁÙ Ä ³以显示此内容:┌┬┐ ├┼┤ └┴┘ ─ │(单行),或使用此命令:echo ÉË» Ìι Èʼ Í º以显示此内容:╔╦╗ ╠╬╣ ╚╩╝ ═ ║(双行)。 - Aacini
2个回答

4
打开一个命令提示符,运行chcp(改变代码页)而不带任何参数,Windows命令处理器将输出字符编码的代码页,该代码页是根据为执行批处理文件的用户账户配置的国家来解释cmd.exe
然而,可以使用例如chcp 437 >nul在批处理文件输出字符之前显式设置代码页437。在这种情况下,批处理文件中的所有字符都应使用代码页437进行编码。代码页437默认用于北美国家(加拿大、美国),因此被所有默认用于Windows控制台窗口的字体支持。

另一个在Windows控制台中常用的编码页是代码页850,与代码页437相似,但相比于代码页437,它具有较少的绘图字符。该编码页默认用于西欧国家。所有默认用于Windows控制台窗口的字体都支持该编码页。

关于代码页437和850的两个参考维基百科页面显示了绘图字符及其十进制和十六进制编码值,每个字符使用一个字节进行编码,即使用"ANSI"编码。"ANSI"在这里并不是一个准确的术语,因为代码页437和850是OEM代码页,并没有由美国国家标准学会(ANSI)标准化。但是微软将术语“ANSI”用于使用每个字符仅一个字节的所有字符编码

关于代码页 437 和 850 的维基百科页面还显示了使用 UTF-8 编码的情况下的 Unicode 代码值。但请注意,默认用于 Windows 控制台窗口的某些字体(如 Windows 7 上默认使用的 Terminal 点阵字体)不支持 UTF-8 编码。有关详细信息,请参阅我的答案:在为他人制作的批处理文件中使用另一种语言(代码页)及其下方的评论。

我建议在批处理文件中使用 "ANSI" 或更精确的 OEM 字符编码,以及使用使用代码页 437 对框线字符进行编码的 echo 命令行。

Windows 图形用户界面文本编辑器默认使用的 "ANSI" 编码适用于北美和西欧国家,其代码是 Windows-1252。如果所使用的文本编辑器不支持使用代码页 437 解释字节并显示批处理文件内容,那么了解这一点可能很重要,因此需要使用通过使用 Windows-1252 字符编码对应的代码值来显示框线字符。

一些编辑器,如UltraEdit,支持使用任何代码页显示以每个字符一个字节编码的文本文件,只要配置的字体也支持该代码页。
字体“Terminal”绝对是编写批处理文件时作为文本编辑器字体的好选择,因为它可以输出方框绘图字符。
示例:
批处理文件包含以下命令行,使用代码页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

注意:您的浏览器使用的字体可能导致上面的批处理代码中的两个方框在所有六行上的宽度不一样,与Windows XP和Windows 7的Windows控制台窗口中显示的真实封闭方框不同。这种情况在默认点阵字体或默认可在Windows控制台窗口属性中使用的字体Lucida Console下也会出现。Lucida Console支持比Terminal更多的字符,但它不是控制台窗口的默认字体。
文本编辑器UltraEdit具有ASCII表视图,可以设置字体Terminal,这是一种OEM字体。这使得使用绘制方框的字符非常容易,在ASCII表视图中使用Terminal字体显示,并且可以通过在视图中双击这些字符来插入到批处理文件中。

0

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

在这种情况下,文件编码使用哪种方式并不重要。您的编辑器使用的字符集才是关键。

我使用Notepad ++,需要设置“编码 -> 字符集 -> 西欧 -> OEM 850”-例如:

enter image description here

我在批处理文件或CMD控制台中需要chcp吗?

如果您不需要所有40个绘图字符,只需要其中的22个,通常不需要进行设置。(我不确定CMD的字符集是否受例如Cyrillic,Japanese或Chinese Windows版本/设置的影响)。

词云

显示相同的ASCII字符编辑器,记事本,DOS命令提示符和Shell


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接