so for 1 byte characters has both upper and lower case forms
def keysym_group(ks1, ks2):
"""Generates a group from two *keysyms*.
The implementation of this function comes from:
Within each group, if the second element of the group is ``NoSymbol``,
then the group should be treated as if the second element were the same
as the first element, except when the first element is an alphabetic
*KeySym* ``K`` for which both lowercase and uppercase forms are
defined.
In that case, the group should be treated as if the first element were
the lowercase form of ``K`` and the second element were the uppercase
form of ``K``.
This function assumes that *alphabetic* means *latin*; this assumption
appears to be consistent with observations of the return values from
``XGetKeyboardMapping``.
:param ks1: The first *keysym*.
:param ks2: The second *keysym*.
:return: a tuple conforming to the description above
"""
keysym 0 and 2 are for lower and upper case. If the character has an upper and lower case equivalents.
This is documented in keysym_group when it should be documented in keysym_normalize
In that case, the group should be treated as if the first element were the lowercase form of ``K`` and the second element were the uppercase form of ``K``.