这是这个问题的精确重复;然而,已接受答案中链接的代码已有近 11 年历史,代码中的此注释引出了我的重复问题:
keysym -> UTF-8 转换有望有一天由 通过 XmbLookupString() 的 Xlib,理想情况下不必在 X 中完成 应用程序。但我们还没有到那一步。
我们到了吗?我知道
XwcLookupString
,但类似...
wchar_t unicode = XKeySymToWideChar( keysym );
...将更加简单和合乎逻辑,并且每当添加或更改 KeySyms 时都不需要更新。
X11/Xlib 中是否有一个简单的函数可以将 KeySym 映射到其 Unicode 等效项?
接受的答案不正确,建议的源代码也不是标准和可靠的方法。由于键盘布局超出了最初的 X11 范围,因此添加内容在 xkb 中实现,即“X 键盘扩展”,大约于 1996 年添加,并且已经存在很长时间了。
XKB_EXPORT uint32_t
xkb_keysym_to_utf32(xkb_keysym_t keysym)
XKB_EXPORT int
xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size)
是您需要的功能。 utf-8版本内部使用utf-32版本,但是你使用你需要的版本。
尝试使用这个node.js模块来生成C表:https://github.com/substack/node-keysym。 它基于此数据集:https://github.com/substack/node-keysym/blob/master/data/keysyms.txt
X11/Xlib 中是否有一个简单的函数可以将 KeySym 映射到其 Unicode 等效项?
因为 Unicode 是在 Xlib 之后几年才发明的,而且没有人去过 回来加这么个东西?大多数 Xlib API 都是代码集 独立的,因为它是在每个语言环境都使用 不同的字符集(ISO 8859-*、Big5、JIS 等),因此您会得到 适合当前语言环境的字符缓冲区。有几个UTF-8 在后来的几年中进行了具体的补充,但大多数情况下我们一直在努力让 Xlib从此安息,将新的API设计推向xcb 相反。
这可能对某人有帮助...改编自 xmodmap 源代码和在线文档 (http://tronche.com/gui/x/xlib/utilities/keyboard/XKeycodeToKeysym.html)
KeySym ks = XKeycodeToKeysym(dpy, keycode+min_keycode, modifier);
const char *s;
if (ks != NoSymbol)
s = XKeysymToString (ks);
else {
printf("Keycode has no symbol. Ignored.\n");
return NULL;
}
printf ("0x%04x (%s)\n", (unsigned int)ks, s);
printf ("wide char:%lc\n", (wchar_t)ks);
Keysym 已经是 UTF 值。问题是设置组合键...例如“á”。
幸运的是,过了一会儿,答案是肯定的!
X11 KeySym 记录在
keysymdef.h
示例 X11 keySym
semicolon
comma
exclam
(...)
cat /usr/include/X11/keysymdef.h | grep exclam | grep --color=never -m1 -o 'U\+[^ ]*'
# U+0021
echo -e "\u$(grep exclam < /usr/include/X11/keysymdef.h | grep --color=never -m1 -o 'U\+[^ ]*' | cut -d'+' -f2)"
# !
获取 X11 键码和 Keysym 名称:
xmodmap -pke
获取修改器
xmodmap -pm
搜索此文件:
locate keysymdef.h