【问题标题】:Console beep character code - wrong number?控制台蜂鸣字符代码 - 数字错误?
【发布时间】:2018-01-06 01:58:08
【问题描述】:

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

打开 CMD 并单击 ALT + 007 产生:

当我点击 ENTER - 我听到哔哔声。这很好。

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

这确实有效并且确实会发出声音。在ECHO 上使用十六进制查看器(无法比较)检查时,圆形项目符号是:

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

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

但是通过 HEX 查看器查看:

问题:

我有点困惑。点击 Alt+65 确实会在任何地方产生A

那么为什么在 Windows GUI 中保存时哔声不同并且不起作用?

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

这两个都是:

notepad++ 的另一个有趣观察:

我认为是和编码等有关,但不理解不一致的地方。

【问题讨论】:

  • 您使用的是 ANSI 编码吗?这是批次完全识别的唯一一个。

标签: windows batch-file cmd windows-console


【解决方案1】:

这不是一个真正的答案,但它对于评论来说太大了。

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

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

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

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

我想说忽略在您尝试输入控制字符时发生的不一致,因为这样做涉及到很多软件,这些软件超出了您的控制范围,并且显然以神秘的方式工作。 (我知道,不是答案。)

【讨论】:

  • 在 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 BEL 字符。当保存为 ANSI 文件时,它只是字节 0x07。需要注意的是,当将此解码为默认 OEM 代码页(例如 437)时,CMD 使用MultiByteToWideChar,它将控制字符 0-31 和 127 映射到 ASCII 控制代码和 不是您在输入 Alt+7 时获得的经典 MS-DOS OEM 符号,等等。
  • @eryksun 你似乎知道你的东西。我认为你应该发布一个答案。
  • @eryksun 你能补充一个答案吗?
【解决方案2】:

我有一个解决方法要建议。把它放在你的脚本中:

forfiles /p "%~dp0" /m "%~nx0" /c "cmd /c echo 0x07"

对于脚本目录中与脚本文件名匹配的每个文件(例如 1 次),它会回显 ASCII 字符 7,并会产生噪音。来自forfiles /? 文档:

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

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


至于我对为什么 Alt+007 的行为不符合预期的猜测,我相信控制台在与窗口应用程序不同的代码页上工作(控制台 = 437,窗口 = 1252 用于 en-US,IIRC)。我也为这个问题苦苦挣扎for reasons,最终在那个 JavaScript 项目中对用于控制台字符 1 到 31 的符号进行了硬编码。

【讨论】:

  • 控制台最初使用 OEM 代码页进行输入和输出,CMD 使用当前输出代码页逐行解码批处理脚本。如果您通过 chcp.com(例如 chcp 1252)将脚本保存为 ANSI 而不是 OEM,您可以在批处理脚本本身中更改为 ANSI 代码页。但是,这不会使用代码 1-31 的经典 DOS 字形。 CMD 通过MultiByteToWideChar 解码,它使用 OEM 代码页的扩展 ASCII 版本,因此使用 ASCII 控制代码(例如 ^G BEL 字符而不是项目符号字形)。
【解决方案3】:

在 cmd 文件中发出哔哔声:

解决方案 1

C:\>rundll32 user32.dll,MessageBeep -1

解决方案 2

C:\>echo ^G>beep.txt
C:\>type beep.txt

注意: ^G是按Ctrl+G得到的,可以通过编辑beep.txt看到字符

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2019-12-20
    • 1970-01-01
    相关资源
    最近更新 更多