天道酬勤,学无止境

如何从信号编号中获得人类可读的描述?(How can I get a human-readable description from a signal number?)

问题

POSIX 标准或其他 C 标准是否提供了一种从信号号恢复有意义的消息的方法,就像strerror()可以从errno恢复消息一样? Gnu C 库有strsignal() ,但如果可能的话,我想要一些可移植到 BSD 和其他 Unix 变体的东西。

回答1

是的,有趣的是,有一种标准方法可以从 POSIX 中的信号中获取字符串消息。 巧合的是,它是 strsignal()。 从 POSIX.1-2008 开始:

strsignal() 函数应将 signum 中的信号编号映射到实现定义的字符串,并应返回指向它的指针。 它应使用与 psignal() 函数相同的消息集。

不为您提供此功能的环境不符合 POSIX。 虽然相对较新(第 7 期于 2008 年发布),但我在 Mac OS X 上有一个strsignal()手册页,所以这是一个好兆头。

回答2

外部定义的数组sys_siglist包含每个信号编号的信号描述,是 BSD 上的标准问题。

#include <signal.h>

extern const char *const sys_siglist[];

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何为 RawInput HID 设备获取人类可读的名称?(How to get human readable name for RawInput HID device?)
    问题 我正在将应用程序从 DirectInput 切换到 RawInput 以进行游戏手柄处理,并且我想为每个游戏手柄提供人类可读的描述。 理想的情况是出现在设备管理器中的设备文本,但 USB 产品描述也可以。 任何方法都应该在没有管理员许可的情况下工作。 到目前为止,我发现了一组线索: HKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM下的注册表中似乎有一个文本字段,它与 DirectInput 提供的名称相同。 这并不完美 - 我有一个在设备管理器中以英文显示的游戏手柄,但在注册表中列为氀。 有没有办法从WM_INPUT提供的 HANDLE 到设备管理器描述? HidD_GetProductString 看起来很有希望,但我不知道如何从 RawInput 句柄中获取 Hid 顶级集合句柄。 编辑:我有一个设备实例路径(例如\\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030} ,我可能需要知道\\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030
  • FreeRTOS —— 11.开发者支持
    11.1本章简介与适用范围 本章重点介绍了一组功能,这些功能可通过以下方式最大程度地提高生产率: 提供有关应用程序行为方式的见解。突出优化机会。在发生错误的时刻捕获错误。 11.2 configASSERT() 在C语言中,宏assert()用于验证程序所做的断言(假设)。 该断言被写为一个C表达式,如果该表达式的值为假(0),则该断言被视为失败。 例如,清单163测试了指针pxMyPointer不是NULL的断言。 应用程序编写者通过提供assert()宏的实现来指定断言失败时要采取的措施。 FreeRTOS源代码不会调用assert(),因为assert()不适用于所有使用FreeRTOS进行编译的编译器。 相反,FreeRTOS源代码包含对名为configASSERT()的宏的大量调用,该宏可以由FreeRTOSConfig.h中的应用程序编写者定义,并且行为与标准C assert()完全相同。 失败的断言必须视为致命错误。 不要试图执行超过断言失败的行。 通过立即捕获并识别许多最常见的错误源,使用configASSERT()可以提高生产率。 强烈建议在开发或调试FreeRTOS应用程序时定义configASSERT()。 定义configASSERT()将大大有助于运行时调试,但也会增加应用程序代码的大小,因此会减慢其执行速度。 如果未提供configASSERT()的定义
  • 如何在 Python 中获得人类可读的时区名称?(How can I get a human-readable timezone name in Python?)
    问题 在我正在处理的 Python 项目中,我希望能够获得一个America/New_York形式的“人类可读”时区名称,对应于系统本地时区,以显示给用户。 我见过的每段访问时区信息的代码都只返回数字偏移量 (-0400) 或字母代码 (EDT) 或有时两者兼而有之。 是否有一些 Python 库可以访问这些信息,或者如果没有,将偏移/字母代码转换为人类可读的名称? 如果与特定时区对应的人类可读名称不止一个,则可能的结果列表或其中任何一个都可以,如果没有与当前时区对应的人类可读名称,我将采用异常或None或[]或其他什么。 澄清:我不记得我最初写这个问题时的确切想法,但我认为我真正想要的是一种将时区转换为人类可读名称的方法。 我不认为这个问题旨在专门关注如何获取系统本地时区,但是对于我想到的特定用例,恰好本地时区是我想要的名称。 我不会编辑有关本地时区的问题,因为有针对这两个方面的答案。 回答1 下面生成一个 defaultdict 映射时区偏移(例如“-0400”)和缩写(例如“EDT”)到常见的地理时区名称(例如“America/New_York”)。 import os import dateutil.tz as dtz import pytz import datetime as dt import collections result=collections
  • 什么是编程语言? [复制](What is a programming language? [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: 什么是计算机编程语言? 不完全是。 我一直在努力想出一个非常好的定义。 这是我到目前为止的看法: 编程语言是一种形式语言,包含语法。 句法规则用于形成语句。 编程语言用于创建一组计算机可以理解的指令。 句法语句的集合称为程序。 我知道它读起来不太好,所以在这方面有一些帮助会很好。 这是维基百科关于该主题的第一段: 编程语言是一种人工语言,旨在表达可由机器(尤其是计算机)执行的计算。 编程语言可用于创建控制机器行为的程序、精确表达算法或作为人类交流的一种模式。 我认为这是生活中每个人都知道它是什么的事情之一,但它很难定义。 我一个人吗? 你的意见? 回答1 我认为,维基百科对此非常正确: A programming language is an artificial language designed to express computations that can be performed by a machine, particularly a computer. 第一句话足以描述它是什么: 它是一种人工语言(这是它的根源) 它旨在表达可由机器执行的计算(即语言的目标/目的) 这就是编程语言最一般的定义。 您的定义缺乏这种普遍性(例如,您的句子非常适合面向命令的语言,但不适用于逻辑编程)。 回答2
  • 如何获得人类可读的 .git/index 转储?(How to get a human-readable dump of .git/index?)
    问题 精简版 我怎样才能得到一个相当详细的、人类可读的.git/index转储? tl;博士版本 我有两个索引文件, myrepo/.git/index和myrepo-copy/.git/index根据diff (“二进制文件......不同”)而不同。 我想了解有关这两个索引文件有何不同的更多详细信息。 当然,我可以查看二进制内容的差异,但我对更直接有意义的东西感兴趣。 因此,我正在寻找一种方法来获取这两个索引文件的人类可读转储,我可以将其与diff进行diff 。 回答1 我会建议一些类似的东西: diff <(GIT_INDEX_FILE=/path/to/index1 git ls-files --stage) <(GIT_INDEX_FILE=/path/to/index2 git ls-files --stage) 正如您已经注意到的,您可以添加--debug选项以获取有关时间戳和其他内容的信息...... 回答2 好的,在我发布我的问题后,我了解到以下内容会生成一个相当全面的索引转储: % git ls-files --stage --debug 回答3 解决问题的最简单方法是将索引文件之一中的更改提交到临时分支,例如 git checkout -b temp git commit 然后复制你在.git/index的另一个索引文件。 您现在可以使用git status
  • 二进制如何转换为硬件?(How does binary translate to hardware?)
    问题 我了解如何将代码编译为程序集,并且该程序集是二进制代码的1:1替代。 有人可以帮助我了解二进制文件如何与硬件连接吗? 二进制文件如何物理读取和运行? if语句在硬件中如何工作? 从谷歌搜索,我想也许我的问题标题应该是“如何将二进制数据放在总线上”,但我不确定。 谢谢。 回答1 我认为这实际上是一个有趣的问题。 我会说“这是通过几个简单的步骤构建计算机的方法”。 从一些简单的逻辑电路开始,例如AND,OR,NOT和触发器。 触发器是一对晶体管,如果一个晶体管导通,另一个晶体管截止,反之亦然。 这样,它可以“记住”一点信息,因此您可以将其视为存储单个二进制数字。 一些输入行可以将其置于一种状态或另一种状态,从而对其进行“写入”。 您可以通过使用一堆触发器来存储更大的数量,并将其称为“寄存器”。 例如,如果一个寄存器中有四个触发器,则有16种可能的组合,因此您可以将其视为保存从0到15的数字。 稍微跳过一下,您可以购买“内存芯片”。 那就是大量的寄存器,比如说其中的16个。 它有4根进线(“地址”线),有4根进线(“数据”线)。 因此,可以输入一个从0到15的数字作为地址,并从16个寄存器中选择一个,其值显示在输出数据线上(从而“读取”它)。 另外几根导线可能会导致数据进入数据导线,从而导致数字被放入(“写入”)寄存器。 现在假设您有一个外部4位寄存器(称为R)和一些电路
  • 人类可读的 GUID(Human Readable GUID)
    问题 我正在编写一个小系统,通过生成可以在我们的网站上兑换 MP3 的代金券,我可以在演出时出售我乐队的音乐。 代金券需要用户输入的代码。该代码需要具有以下特性: 在长度和内容方面具有一定程度的人类可读性,以防止用户沮丧和数据输入错误。 给定一个优惠券代码,猜测另一个优惠券代码并非易事。 如果我使用 GUID,我会担心第 1 点。如果我使用递增整数,我会担心第 2 点。中间必须有一些快乐的媒介,对吗? 我想也许这项工作已经完成,有一个理想的解决方案在等着我。 如果没有,我想我会使用随机的字母数字字符串,或者可能只使用字母(为了清楚起见,不包括 I 和 O),并且应用程序块 IP 地址失败 X 次,这表明可能的蛮力攻击。 如果我这样做,字符串的长度和 X 的值会起作用,为什么? 谢谢你的帮助! 更新:我没有完全明确该方法:我将生成用于打印的凭证代码列表,然后在演出后输入“已售出”代码。 因此,我认为像校验和这样的元素不是必需的,就像它们在不使用验证服务器的软件密钥中一样。 回答1 您可以使用经过英语音节训练的马尔可夫链来创建由可发音的乱码单词组成的句子。 只需在打印时将生成的句子添加到有效凭证的数据库中(当然,当它们被兑换时使它们无效)。 回答2 我会使用你自己的编码方案。 除了省略 I 和 O 之外,为了获得最佳可读性,从近同音组(C/E、M/N)和多音节字母(例如 W
  • Linux 中的核心转储(Core dump in Linux)
    问题 每当我的进程崩溃时,我都想创建一个核心转储。 目前我正在遵循这种方法: 使用 gcc/g++ 的“-g”构建程序的特殊“调试”版本。 执行“ulimit -c 无限制” 现在,每当程序崩溃时,我们都会得到核心转储。 但我想尽量减少步骤数,以便: 应该始终创建核心转储。 即使它是“发布”构建。 不应要求用户手动执行命令“ ulimit -c unlimited ”。 该核心转储的回溯应该能够给出调用的文件、函数、行号。 这是人类可读形式的堆栈跟踪。 我不想使用“-g”将程序构建为调试版本。 或者至少它不应该包含生成人类可读堆栈跟踪不需要的任何其他调试信息。 因为这将是程序的发布版本。 所以我有两个问题: 如何在程序的“发布”版本中创建核心转储? 总是。 无需手动执行“ ulimit -c unlimited ” 回答1 关于核心限制,您可以通过调用 setrlimit 在 C 中自己完成。 在 GNU (glibc) 或 BSD 系统上,您可以通过调用回溯和相关系统调用来获得回溯。 然后,您必须通过运行addr2line (或复制其功能)将函数地址转换为函数名称。 只是不要使用-g ,您仍然可以获得回溯(除了不会出现内联函数)。 回答2 通常的解决方案是使用 -g 构建并在发布文件之前去除调试信息。 寻找“strip”命令。 您保留带有调试信息的文件
  • 主题建模 - 为主题分配人类可读的标签(Topic Modelling - Assign human readable labels to topic)
    问题 我想为我的主题建模结果分配人类可读的标签。 是否有任何我可以使用的软件库或数据集将这些关键词作为输入,并返回一个标题来描述该主题。 例子: 输入: ["Church","Priest","God","Prayer"] 输出: "Religion" 注意:我想要自动创建标签 - 不像其他人之前问过的那样手动创建。 回答1 请参阅 Jey Han Lau 的这篇论文。 他描述了如何使用不同的来源和特征自动生成标签。 我们从排名靠前的主题词、包含排名靠前的主题词的维基百科文章的标题以及从维基百科文章标题中提取的一组过滤子短语生成一组候选标签。 我们使用关联度量、词汇特征和信息检索特征的组合对标签候选者进行排名。
  • Boost 错误代码人类可读的描述(Boost error codes human-readable description)
    问题 我在 Boost Asio 程序中发现错误,例如 if (!error) { //do stuff } else { std::cout << "Error : " << error << std::endl; //handle error } 但是该错误不是人类可读的(例如,在没有证书的情况下连接到 SSL 服务器会出现错误 asio.ssl:335544539)。 有没有更好的方法来显示错误? 回答1 如果您可能使用boost::system::error_code您可以调用: error.message() 以获得更人性化的信息。 使用operator<<转换为: os << ec.category().name() << ':' << ec.value() 您可以在此处查看error_code可用成员的详细概述。
  • 在 XML 成为标准并考虑到它的所有缺点之前,是什么让 XML 如此流行?(Before XML became a standard and given all its shortcomings, what made XML so popular?)
    问题 是的 XML 是人类可读的,但逗号分隔的文本和属性文件也是如此。 XML 臃肿、难以解析、难以在代码中修改,再加上我可以考虑的大量其他问题。 我的问题是 XML 最吸引人的品质是什么让它如此受欢迎???? 回答1 与 CSV 文件相比,它的主要优势之一是它可以轻松表示分层数据。 要做到这一点,您要么需要像 XML 这样的自描述树结构,要么需要像 SWIFT 或 EDI 这样的预定义格式(如果您曾经处理过其中任何一个,那么您就会意识到 XML 解析起来很简单)相比下)。 它实际上很容易解析的原因之一是因为它“臃肿”。 这些结束标记意味着您可以准确地将元素的结束与开始匹配,并在树变得不平衡时进行计算。 您不能在 JSON 等“轻量级”替代方案中做到这一点。 它易于解析的另一个原因是因为它从一开始就完全支持 Unicode 编码,因此您不必担心目标系统上的默认代码页是什么,或者如何编码多字节字符,因为该信息全部包含在文件中。 让我们不要忘记随之而来的其他人工制品,如定义的描述和验证机制 (XSD) 以及强大的声明性转换机制 (XSLT)。 回答2 那是 90 年代末,互联网很热很热,但公司的系统无法靠近互联网。 他们花了无数个小时来处理 CORBA 并计划使用 Enterprise JavaBeans 让这些旧系统与新系统进行通信。 随之而来的是 SGML
  • python中人类可读的时区?(Human readable timezone in python?)
    问题 如何从python中的这些时间格式获得人类可读的时区? 以及如何将同一时间转换为该时区? 'scheduled_datetime': '2017-07-30T10:00:00+05:30' session.scheduled_datetime datetime.datetime(2017, 7, 30, 10, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>) 回答1 您可以使用iso8601或dateutil.parser : import iso8601 import dateutil.parser from pytz import timezone fmt = '%Y-%m-%d %H:%M:%S %Z' ist = timezone('Asia/Kolkata') str = '2017-07-30T10:00:00+05:30' d = iso8601.parse_date(str).astimezone(ist) print(d.strftime(fmt)) d = dateutil.parser.parse(str).astimezone(ist) print(d.strftime(fmt)) 这两种情况的输出是: 2017-07-30 10:00:00 上午 请注意,我使用了Asia
  • Oracle APEX 中人类可读的 URL(human readable URLs in Oracle APEX)
    问题 如何在 oracle apex 中制作人类可读的 URL 目前我的 url 看起来像 https://example.com/apex/f?p=107:1:13482402024834::::: 我希望我的数据库应用程序 url 看起来像什么。 https://example.com/apex/home 我正在使用 oracle apex 18.2 回答1 你实际上可以做到这一点。 Oracle Apex 20.1 版默认带有可读的 URL 结构,同时允许您改回旧类型的 URL 回答2 您可以在数据库中定义 DAD,并在应用程序属性的用户界面中为 apex 应用程序提供名称,该 url 将使用应用程序名称而不是应用程序编号,也可以屏蔽您可以为页面提供别名的页码。 回答3 在 Apex 19.2 之前没有这样的选项。 在 Apex 20.1 版本中,有一个选项可以修改 URL 请参阅以下链接以获取详细说明 https://docs.oracle.com/en/database/oracle/application-express/20.1/htmdb/understanding-friendly-url-syntax.html#GUID-716B85EC-2D9B-49F7-BABE-2C4CA347F198 回答4 Oracle Apex 18.2 没有这样的选项。
  • 什么是solaris中的SRU? 如何找到SRU编号?(What is SRU in solaris? How to find the SRU number?)
    问题 我使用了pkg list entire命令,我得到了version column的输出,如下所示: 0.5.11-0.175.1.0.0.24.2 。 如何从中找到SRU? 我们可以升级/降级到特定的 SRU 吗? 回答1 SRU 是Support Repository Update的缩写,从支持存储库为该操作系统安装新的软件包版本,就像为旧的 Solaris 版本安装补丁集群一样。 版本中的各个字段在 Oracle Solaris Package Versioning 中进行了解释。 Oracle 仅向签订支持合同的客户提供 SRU - 如果您有支持合同,您可以在 Oracle 支持知识库中的 Solaris 11 Support Repositories Explained 中阅读有关 SRU 的更多信息,并查看每个 SRU 中针对 Solaris 11.1 和 Solaris 11.2 的可用修复程序. 回答2 如果您运行“pkg info entire”,它还会以人类可读的格式显示 SRU 名称(如果您已从支持存储库安装 - 否则它会显示发布信息)。 0.175.1.0.0.24.2 中的第 4 位数字是 SRU 编号 在上面的示例中,它是基本的 Solaris 11.1 发行版 - 尚未安装 SRU。 如果在其上安装了 SRU,您将获得类似 0.5.11-0.175
  • 为什么 .class 文件不是人类可读的? [关闭](Why is a .class file not human readable? [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 6年前关闭。 改进这个问题 当一个 java 文件被编译时,它会生成一个 .class 文件。 现在这个 .class 文件有 JVM 解释的字节码。 当我们在文本编辑器中打开 .class 文件时,它不是人类可读的。 现在要查看字节码,可以使用像 javap 这样的反汇编程序。 我的问题是,为什么我们需要反汇编字节码才能查看字节码本身? 反汇编程序实际上做了什么,将 .class 文件转换为人类可读的格式? 回答1 Java 虚拟机模拟一台机器。 这就是为什么它被称为机器的原因,尽管它是硬件中不存在的虚拟机。 因此,当考虑javap outout 和实际 Java 字节码的区别时,想想汇编和机器码之间的区别: 汇编代码使用所谓的助记符来使代码可读。 然而,这样的助记名称与机器无关,因为机器只知道如何读取和操作二进制数据。 因此,我们可以选择使用其中每个这样的助记符被转换成其二进制当量的汇编程序汇编助记符(及其潜在的参数)。 例如,为了从特定寄存器加载一个值,我们会在汇编中编写类似load 0xFF ,而不是使用该指令的实际二进制操作码,可能类似于1001 1011 1111 1111 。 类似地,对于 Java 字节码,助记符是javap产生的
  • 从unix时间戳获取人类可读的相对时间和日期?(Getting human readable relative times and dates from a unix timestamp?)
    问题 从像 1290529723 这样的 Unix 时间戳开始,我将如何(假设是 gmt)获取有关它是否为的信息: 今天(如果有,什么时间) 在过去的 7 天内(如果是,是哪一天...星期一、星期二等?) 超过一周(如果是这样,如何以 dd/mm/yy 格式输出?) 我需要这个信息列表,比如 iPhone 的邮件应用程序,其中日期/时间是相对于当前日期和时间显示的,如下所示: 15:45 Yesterday Sunday Saturday 10/10/10 等等 回答1 获得尊重设备区域设置的解决方案需要一些摆弄。 以下方法relativeStringFromDate 返回一个表示日期的字符串,格式如下: 根据区域设置,如果日期是今天,则只是时间(例如“3:40PM”或“15:40”) 'Yesterday' 如果日期是昨天(但将国际化为语言环境) 如果日期是两到六天前的星期几的名称(例如,“星期一”、“星期二”等,同样根据区域设置的语言) 根据区域设置,如果日期超过一周前,则仅是日期组件(例如,美国的“1/20/2012”与欧洲的“20/1/2012”) - (NSString *)relativeStringFromDate:(NSDate *)date { if ([self dateIsToday:date]) return [self dateAsStringTime
  • 有人类可读的编程语言吗? [关闭](Is there a human readable programming language? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我的意思是,是否存在具有人类风格编码的编码语言? 例如: Create an object called MyVar and initialize it to 10; Take MyVar and call MyMethod() with parameters. . . 我知道它不是那么有用,但是创建这样的语法可能会很有趣。 回答1 COBOL很像那样。 SET MYVAR TO 10. EXECUTE MYMETHOD with 10, MYVAR. 维基百科的另一个示例: ADD YEARS TO AGE. MULTIPLY PRICE BY QUANTITY GIVING COST. SUBTRACT DISCOUNT FROM COST GIVING FINAL-COST. 奇怪的是,尽管它的设计可以读成英文,但大多数程序员还是用奇怪的命名约定完全破坏了这一点: SET VAR_00_MYVAR_PIC99 TO 10. EXECUTE PROC_10_MYMETHOD with 10, VAR_00_MYVAR_PIC99
  • 为什么/何时适当地重写ToString?(Why / when would it be appropriate to override ToString?)
    问题 我正在研究C#,并且想知道重写ToString和好处是什么,如下面的示例所示。 是否可以使用不带覆盖的通用方法,以更简单的方式完成此操作? public string GetToStringItemsHeadings { get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); } } public override string ToString() { string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal); return strOut; } 回答1 您需要重写ToString吗? 不。 您能否以其他方式获得对象的字符串表示形式? 是的。 但是,通过使用ToString您将使用所有对象都通用的方法,因此其他类也知道此方法。 例如,每当.NET框架要将对象转换为字符串表示形式时, ToString都是主要的候选对象(如果要提供更详尽的格式设置选项,则还有其他选择)。 具体来说, Console.WriteLine(yourObject); 会调用yourObject.ToString() 。 回答2 我将直接从.NET开发系列的《框架设计指南》中为您提供答案。
  • 如何以人类可读的形式转储 GHC 简化器输出?(How to dump GHC simplifier output in human-readable form?)
    问题 我有以下程序: data Peano = Zero | Succ Peano deriving (Show) add Zero b = b add (Succ a) b = add a (Succ b) mul Zero b = Zero mul (Succ a) b = add b (mul a b) four x = let two = Succ (Succ Zero) in mul two two 我想从 GHC 得到这样的东西: add = \ ds b -> case ds of Zero -> b Succ a -> add a (Succ b) mul = \ ds b -> case ds of Zero -> Zero Succ a -> add b (mul a b) four = let two = Succ (Succ Zero) in mul two two 我设法得到的最好的是 ghci -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques foo.hs 但它需要大量手动移除 GHC 生成的东西才能获得上面的代码。 是否有 GHC 的开关或执行清理的第三方脚本? 有没有办法至少摆脱case {tick (main:Main, 8)} @ (State# RealWorld) of _
  • Javascript - 获取任何键盘布局的键描述(Javascript - get key description for any keyboard layout)
    问题 对于富 Web 应用程序,我需要键盘快捷键。 因为有许多不同的键盘布局,所以它们必须是可配置的。 不幸的是,我无法找到一种方法将键盘事件映射到人类可读的快捷方式名称,例如Ctrl + Alt + Y或Alt + \ 。 keypress事件是无用的,因为它不会为所有键触发。 以下是keydown事件的一些属性: charCode :仅适用于可打印字符。 已弃用,根据 MDN code :有效,但忽略键盘布局。 当我按 Z 时,我在德语键盘上收到code: "KeyY" 。 key :有效,但根据修饰符给出不同的结果。 例如 Shift+3 在我的键盘上产生key: "§" ,在大多数美国键盘上产生key: "#" 。 keyCode :该值不是唯一的。 Ä, Ö, Ü 或 ^ 产生keyCode: 0 。 已弃用,根据 MDN which :就像keyCode一样,值不是唯一的。 已弃用,根据 MDN altKey 、 ctrlKey 、 metaKey 、 shiftKey :用于检测修饰键 我该怎么做? 在不知道用户的键盘布局的情况下甚至可能吗? 回答1 问题是,此时您永远无法从浏览器中知道键盘布局,您只能猜测和推测。 有多种方法可以尝试某种检测,但它们总是很复杂并且不是开箱即用的解决方案。 但是,您可以做一些事情来以某种方式确定按下了哪个键。 所以 Keydown