Windows 控制台蜂鸣音字符代码-错误号码?

Windows 控制台蜂鸣音字符代码-错误号码?,windows,batch-file,cmd,windows-console,Windows,Batch File,Cmd,Windows Console,ASCII字符代码0x07是一个蜂鸣字符 打开CMD并单击ALT+007可生成: 当我点击回车键时,我听到一声嘟嘟声。这很好 我搜索了如何在批处理文件末尾添加嘟嘟声,我发现这是解决方案:(我将其粘贴为图像,因为编辑后不会显示圆形项目符号): 这确实有效,而且确实发出声音。在ECHO上使用十六进制查看器(具有超越性)检查时,圆形项目符号为: 但是如果我手动将ALT+7添加到文档中,我会看到: 这是一个95作为一个十六进制-它不是一个哔哔声。此外,我转到工作批处理文件并使用ALT+7添加了一

ASCII字符代码0x07是一个蜂鸣字符

打开CMD并单击ALT+007可生成:

当我点击回车键时,我听到一声嘟嘟声。这很好

我搜索了如何在批处理文件末尾添加嘟嘟声,我发现这是解决方案:(我将其粘贴为图像,因为编辑后不会显示圆形项目符号):

这确实有效,而且确实发出声音。在
ECHO
上使用十六进制查看器(具有超越性)检查时,圆形项目符号为:

但是如果我手动将ALT+7添加到文档中,我会看到:

这是一个95作为一个十六进制-它不是一个哔哔声。此外,我转到工作批处理文件并使用ALT+7添加了一行新行:

但通过HEX viewer查看:

问题:

我有点困惑。单击Alt+65确实会在所有位置生成
A

那么,为什么蜂鸣音会有所不同,并且在保存到Windows GUI中时不起作用呢

在控制台中,如果我单击
ALT+007
我会得到
^G
(它会发出嘟嘟声),但当我单击
ALT+7
时,我会得到一个圆圈,它不是嘟嘟声:

这两个都是:

另一个有趣的观察是通过记事本++:


我认为这与编码等有关,但我不理解其中的不一致性。

这不是一个真正的答案,但它太大了,无法发表评论

“手动将ALT+7添加到文档”部分产生了本不应该产生的奇怪结果。结果应该是单个0x07字符。当你按下ALT+7时,你的编辑可能做了一些有趣的事情

这种故障排除的问题在于,您使用的工具具有复杂的行为,从而扭曲了实验。这些工具也有奇怪的模式和状态。例如,控制台子系统的编码是什么

我试过这样做:
copy con x.bat
键入
echo
,然后是
Alt+7
,然后是
Ctrl+Z
,得到了一个蜂鸣的批处理文件。这个角色看起来像一颗子弹。
然后我尝试了
Alt+007
,我也得到了一个蜂鸣的批处理文件,但是现在字符是
^G

C:\>
提示符下,我输入了
echo
,然后输入了
Alt+7
,也产生了一个子弹,但没有嘟嘟声。但是一个看起来像
^G
Alt+007
确实发出了嘟嘟声。算了吧


我想说的是,当您试图输入一个控制字符时,请忽略出现的不一致,因为这样做涉及到很多软件,它们超出了您的控制范围,显然以神秘的方式工作。(我知道,没有答案。)

我有一个解决办法可以建议。在脚本中添加以下内容:

forfiles/p“%~dp0”/m“%~nx0”/c“cmd/c echo 0x07”
对于脚本目录中与脚本文件名匹配的每个文件(例如1次),它将回显ASCII字符7,并发出噪音。从
forfiles/?
文档:

要在命令行中包含特殊字符,请使用0xHH格式的字符十六进制代码(例如,0x09表示制表符)。内部CMD.exe命令前面应加上“CMD/c”

forfiles
是一个方便的实用工具,可在需要不可打印或扩展字符时滥用



至于我对Alt+007为何表现不符合预期的推测,我相信控制台与窗口应用程序在不同的代码页上工作(对于en-US,控制台=437,窗口=1252,IIRC)。我也遇到过这个问题,最终还是求助于对JavaScript项目中控制台字符1到31使用的符号进行硬编码。

要在cmd文件中发出嘟嘟声:

解决方案1

C:\>rundll32 user32.dll,MessageBeep -1
解决方案2

C:\>echo ^G>beep.txt
C:\>type beep.txt
注意:
^G通过按Ctrl+G获得,您可以通过编辑beep.txt查看字符

您是否使用ANSI编码?在Windows中,Alt+7是系统区域设置的OEM字符,例如代码页437(美国英语)或856(希伯来语)。在记事本之类的窗口中键入时,它将作为Unicode字符发送到应用程序,如U+2022(项目符号)。然后,如果应用程序将其保存为系统ANSI代码页,则在代码页1252(美国英语)或1255(希伯来语)中将其编码为字节0x95。然后,当从批处理文件读取时,CMD使用OEM代码页(除非通过chcp.com更改)对其进行解码,该代码页在代码页437中为“ò”,在代码页856中为“ץ”。我忘了补充一点,如果在数字前面加上键盘上的0,Windows将使用ANSI代码页而不是OEM代码页。在这种情况下,输入Alt+007将给出一个ASCII贝尔字符。当保存为ANSI文件时,它只是字节0x07。需要注意的是,当将其解码为默认OEM代码页(例如437)时,CMD使用
MultiByteToWideChar
,它将控制字符0-31和127映射到ASCII控制代码,而不是输入Alt+7时获得的经典MS-DOS OEM符号,依此类推。@eryksun您似乎知道自己的东西。我想你应该发布一个答案。@eryksun你能添加一个答案吗?控制台最初使用OEM代码页进行输入和输出,CMD使用当前输出代码页逐行解码批处理脚本。如果通过chcp.com(例如
chcp 1252
)将脚本保存为ANSI而不是OEM,则可以在批处理脚本本身中更改为ANSI代码页。但是,对于代码1-31,这不会使用经典的DOS标志符号。CMD通过
MultiByteToWideChar
进行解码,它使用OEM代码页的扩展ASCII版本,从而使用ASCII控制代码(例如,一个^g BEL字符而不是一个项目符号符号)。