问题
This is an exact duplicate of this question; however the code linked in the accepted answer is nearly 11 years old, and this comment in the code leads to my duplicate question:
The keysym -> UTF-8 conversion will hopefully one day be provided by Xlib via XmbLookupString() and should ideally not have to be done in X applications. But we are not there yet.
Are we there yet? I'm aware of XwcLookupString
, but something like...
wchar_t unicode = XKeySymToWideChar( keysym );
... would be much simpler and logical, and not require updating whenever KeySyms are added or changed.
Is there a simple function in X11/Xlib that will map a KeySym to its Unicode equivalent?
回答1:
Try this node.js module to generate C table: https://github.com/substack/node-keysym . It is based on this dataset: https://github.com/substack/node-keysym/blob/master/data/keysyms.txt
回答2:
Is there a simple function in X11/Xlib that will map a KeySym to its Unicode equivalent?
The definitive answer is no
Because Unicode was invented years after Xlib and no one ever went back to add such a thing? Most of the Xlib API is codeset independent since it was written in the days when every locale used a different character set (ISO 8859-*, Big5, JIS, etc.), so you get a char buffer appropriate to the current locale. There were a few UTF-8 specific additions in later years, but mostly we've been trying to let Xlib rest in peace since then, pushing new API design towards xcb instead.
回答3:
This may help somebody... adapted from xmodmap source and online doc (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 is already the UTF value. The problem would be to set keycombinations... 'á' for example.
来源:https://stackoverflow.com/questions/8970098/how-to-map-a-x11-keysym-to-a-unicode-character