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

时间:2012-01-23 10:18:36

标签: unicode input x11 xorg keyboard-layout

这是this question的完全重复;但是,在接受的答案中链接的代码将近11年,代码中的这条评论会导致我的重复问题:

  

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

我们在吗?我知道XwcLookupString,但有点像......

wchar_t unicode = XKeySymToWideChar( keysym );

...会更加简单和合乎逻辑,并且无论何时添加或更改KeySyms都不需要更新。

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

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

  

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

The definitive answer is no

  

因为Unicode是在Xlib之后多年发明的,而且没有人去过   回来添加这样的东西?大多数Xlib API都是代码集   独立,因为它是在每个语言环境使用的日子里写的   不同的字符集(ISO 8859- *,Big5,JIS等),所以你得到一个   适合当前语言环境的char缓冲区。有一些UTF-8   在以后的几年里,特别是我们一直试图让它们增加   从那以后,Xlib安静地休息,将新的API设计推向了xcb   代替。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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