如何将 X11 KeySym 映射到 Unicode 字符?

问题描述 投票:0回答:5

这是这个问题的精确重复;然而,已接受答案中链接的代码已有近 11 年历史,代码中的此注释引出了我的重复问题:

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

我们到了吗?我知道

XwcLookupString
,但类似...

wchar_t unicode = XKeySymToWideChar( keysym );

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

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

unicode input x11 xorg keyboard-layout
5个回答
6
投票

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


5
投票

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


3
投票

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

最终的答案是

因为 Unicode 是在 Xlib 之后几年才发明的,而且没有人去过 回来加这么个东西?大多数 Xlib API 都是代码集 独立的,因为它是在每个语言环境都使用 不同的字符集(ISO 8859-*、Big5、JIS 等),因此您会得到 适合当前语言环境的字符缓冲区。有几个UTF-8 在后来的几年中进行了具体的补充,但大多数情况下我们一直在努力让 Xlib从此安息,将新的API设计推向xcb 相反。


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 值。问题是设置组合键...例如“á”。


0
投票

幸运的是,过了一会儿,答案是肯定的!

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
© www.soinside.com 2019 - 2024. All rights reserved.