7

这是这个问题的完全重复;然而,在接受的答案中链接的代码已经有将近 11 年的历史了,代码中的这条评论导致了我的重复问题:

keysym -> UTF-8 转换有望有一天由 Xlib 通过 XmbLookupString() 提供,理想情况下不必在 X 应用程序中完成。但我们还没有。

我们到了吗?我知道XwcLookupString,但类似...

wchar_t unicode = XKeySymToWideChar( keysym );

...将更简单和合乎逻辑,并且在添加或更改 KeySyms 时不需要更新。

X11/Xlib 中是否有一个简单的函数可以将 KeySym 映射到其 Unicode 等效项?

4

4 回答 4

5

试试这个 node.js 模块来生成 C 表:https://github.com/substack/node-keysym。它基于这个数据集:https ://github.com/substack/node-keysym/blob/master/data/keysyms.txt

于 2012-01-23T22:34:11.997 回答
2

X11/Xlib 中是否有一个简单的函数可以将 KeySym 映射到其 Unicode 等效项?

确定的答案是否定的

因为 Unicode 是在 Xlib 之后几年发明的,而且没有人回去添加这样的东西?大多数 Xlib API 都是独立于代码集的,因为它是在每个语言环境使用不同字符集(ISO 8859-*、Big5、JIS 等)的时代编写的,因此您可以获得适合当前语言环境的字符缓冲区。在后来的几年里有一些 UTF-8 特定的添加,但从那时起我们一直试图让 Xlib 安息,而是将新的 API 设计推向 xcb。

于 2012-01-26T03:42:08.030 回答
2

接受的答案不正确,建议的源代码也不是标准和可靠的方式。由于键盘布局超出了最初的 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 的,但是你使用你需要的那个。

于 2020-12-06T13:50:06.040 回答
1

这可能对某人有所帮助...改编自 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 值。问题是设置键组合......例如'á'。

于 2013-09-17T02:08:19.213 回答