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

9
这是此问题的完全副本;但是,接受答案中链接的代码已经近11年没有更新了,并且代码中的这个评论导致了我的重复提问:

-> UTF-8转换希望有一天可以通过Xlib和XmbLookupString()来实现,并且最好不必在X应用程序中进行。但我们还没有到那里。

我们到达那里了吗?我知道XwcLookupString,但类似于...
wchar_t unicode = XKeySymToWideChar( keysym );

如果不需要更新KeySyms时,可以更简单和逻辑化。

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

4个回答

6

被接受的答案是不正确的,同时建议的源代码也不是标准和可靠的方式。由于键盘布局超出了初始X11范围,因此这些新增功能在1996年左右添加到了xkb中,即“X键盘扩展”,并长期存在。

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版本,但您可以使用您需要的版本。


问题要求在X11/Xlib中提供一个函数。尽管这个回答增加了价值,但需要澄清的是建议的函数实际位于_libxkbcommon_中。虽然这个库通常是可用的,但它是一项额外的依赖。 - sampi
问题要求在 X11/Xlib 中编写一个函数。虽然这个答案增加了价值,但需要澄清的是,建议使用的函数 存在于 libxkbcommon 中。虽然这通常是可用的,但它是一个额外的依赖项。 - sampi

5

1
谢谢提供链接!代码基本上与问题中提供的链接相同,甚至使用了相同的数据集。 - x-x
1
对于任何可能感兴趣的人,我编写了一个自包含的、MIT许可证的XKeysymToUnicode()实现。它使用在keysymdef.h X11头文件中找到的定义。您可以在此处找到它:https://bitbucket.org/janvrany/stx-libview/commits/c7cab63f9ec904aef8ce16e9cb1c9dc2d6987619 - J.V.

3
在X11 / Xlib中是否有一个简单的函数可以将KeySym映射到其Unicode等效项? 明确的答案是“没有” 因为Unicode是在Xlib之后几年发明的,而且从未有人回来添加这样的东西?大多数Xlib API是代码集独立的,因为它是在每个区域设置使用不同字符集(ISO 8859- *,Big5,JIS等)的日子里编写的,因此您会获得适合当前区域设置的char缓冲区。后来有一些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值。问题在于设置按键组合......例如'á'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接