有些 X 应用程序接受我的非拉丁字符,有些则忽略它们

有些 X 应用程序接受我的非拉丁字符,有些则忽略它们

我使用的是双键盘布局的 X 环境:us,il。现在,在我的某些应用程序和il布局中,希伯来字符无法显示,但标点符号可以显示。在其他应用程序中,希伯来字符可以正常显示,并添加到我输入的任何文本中。英语布局工作正常。我将在下面提供有关我的配置的完整详细信息。

我的问题是:为什么会发生这种情况?更重要的是,我该如何修复/规避这个问题,让所有应用程序也接受希伯来语字符?

有关我的设置的详细信息

  • 物理键盘布局:标准美国 104 键(如这个)。
  • 操作系统分布:Devuan 2.0 ASCII(~= Debian 9.0 Stretch)
  • XKB 配置:

    $ setxkbmap -query
    rules:      evdev
    model:      pc105
    layout:     us,il
    variant:    ,
    options:    grp:alt_shift_toggle,grp_led:scroll
    
  • 桌面环境:我使用 Cinnamon 和 LXQt 时都遇到过这种情况;还没有尝试过其他的。

  • 拒绝希伯来字符的应用程序:Cinnamon 的 Alt+F2 启动器;LeafPad;GEdit、xterm。
  • 接受希伯来字符的应用程序:KWrite、GNOME 终端、LibreOffice、Firefox、Kolourpaint、lxterminal、Konsole。

xev输出

a按下键盘时输出:

KeyRelease event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369470632, (96,-25), root:(146,62),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

KeyPress event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369474392, (96,-25), root:(146,62),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

切换键盘布局时的输出:

KeyPress event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369547896, (75,-23), root:(125,64),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369548008, (75,-23), root:(125,64),
    state 0x8, keycode 62 (keysym 0xfe08, ISO_Next_Group), same_screen YES,
    XKeysymToKeycode returns keycode: 50
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

PropertyNotify event, serial 34, synthetic NO, window 0x7e00001,
    atom 0x176 (XKLAVIER_STATE), time 369548013, state PropertyNewValue

PropertyNotify event, serial 34, synthetic NO, window 0x7e00001,
    atom 0x176 (XKLAVIER_STATE), time 369548013, state PropertyNewValue

KeyRelease event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369548072, (75,-23), root:(125,64),
    state 0x2008, keycode 62 (keysym 0xfe08, ISO_Next_Group), same_screen YES,
    XKeysymToKeycode returns keycode: 50
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369548168, (75,-23), root:(125,64),
    state 0x2008, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

a再次按下键盘时的输出(此键也对应希伯来字母 shin,ש):

KeyPress event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369560440, (75,-23), root:(125,64),
    state 0x2000, keycode 38 (keysym 0xcf9, hebrew_shin), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x7e00001,
    root 0x43, subw 0x0, time 369560504, (75,-23), root:(125,64),
    state 0x2000, keycode 38 (keysym 0xcf9, hebrew_shin), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xmodmap -pke输出

部分输出xmodmap -pke

... etc. etc. ...
keycode  24 = q Q slash Q U05C2
keycode  25 = w W apostrophe W U05C1
keycode  26 = e E hebrew_qoph E U05B8
keycode  27 = r R hebrew_resh R U05B3
keycode  28 = t T hebrew_aleph T
keycode  29 = y Y hebrew_tet Y U05F0
keycode  30 = u U hebrew_waw U U05B9
keycode  31 = i I hebrew_finalnun I
keycode  32 = o O hebrew_finalmem O
keycode  33 = p P hebrew_pe P U05B7
keycode  34 = bracketleft braceleft bracketright braceright U05B2
keycode  35 = bracketright braceright bracketleft braceleft U05BF
keycode  36 = Return NoSymbol Return
keycode  37 = Control_L NoSymbol Control_L
keycode  38 = a A hebrew_shin A U05B0
keycode  39 = s S hebrew_dalet S U05BC
keycode  40 = d D hebrew_gimel D
keycode  41 = f F hebrew_kaph F
keycode  42 = g G hebrew_ayin G U05F1
keycode  43 = h H hebrew_yod H U05F2
keycode  44 = j J hebrew_chet J U05B4
keycode  45 = k K hebrew_lamed K
keycode  46 = l L hebrew_finalkaph L rightdoublequotemark
keycode  47 = semicolon colon hebrew_finalpe colon doublelowquotemark
keycode  48 = apostrophe quotedbl comma quotedbl U05F4
keycode  49 = grave asciitilde semicolon asciitilde U05F3
keycode  50 = Shift_L ISO_Next_Group Shift_L ISO_Next_Group
keycode  51 = backslash bar backslash bar U05BB
keycode  52 = z Z hebrew_zain Z
keycode  53 = x X hebrew_samech X U05B6
keycode  54 = c C hebrew_bet C U05B1
keycode  55 = v V hebrew_he V
keycode  56 = b B hebrew_nun B NoSymbol U05C6
keycode  57 = n N hebrew_mem N
keycode  58 = m M hebrew_zade M U05B5
keycode  59 = comma less hebrew_taw greater rightsinglequotemark
keycode  60 = period greater hebrew_finalzade less singlelowquotemark
keycode  61 = slash question period question division
... etc. etc. ...

语言相关的环境变量

$ env | grep LANG
LANG=en_IL
GDM_LANG=en_US.utf8
LANGUAGE=en_IL:en

其他说明

  • 如果我创建一个干净的用户帐户,该用户会不是遇到此问题。因此这一定是某种用户特定的设置。
  • 如果我复制希伯来语文本,我可以将其粘贴到拒绝希伯来语字符的应用程序中,并且可以正常显示。
  • 我保留了以前非 Devuan 的 Linux 安装(Linux Mint 18.3)的主文件夹。

答案1

您需要删除/清除您的 ~/.xinputrc 文件。

受到 @harrymc 建议的一些猜测的启发,我找到了罪魁祸首:我的~/.xinputrc文件,在我之前的发行版(Linux Mint 18.3)上生成。它说:

# im-config(8) generated on Wed, 25 Jan 2017 22:44:55 +0100
run_im xim
# im-config signature: 21f3e409b30c3de81e8302273ccb3d5c  -

im-config机制是

使用 GTK GUI 或控制台终端对话的 X Window System 上的输入法。

这解释了为什么只有(较简单的)GTK 应用程序似乎受到影响。我对输入法业务一点也不熟悉,但是 - 如果我删除此文件或注释掉该run_im选项 - 所有应用程序现在似乎都接受我输入的希伯来语字符。

答案2

下面的答案并没有解决发帖人的问题,但随后的讨论最终指出了这个问题。

我们都认为问题的根源在于 Mint 和 Devuan 之间的一些差异,当发帖者将他的整个主文件夹从一个复制到另一个时,这种差异就显现出来了。一个很大的提示是,在 root 用户的配置文件下,问题并没有显现出来。

然后,发帖者检查了他的主文件夹中与键盘相关的文件,结果可以在他的回答中找到。


你的问题似乎和帖子里的问题一样
终端不接受某些输入的 Unicode 字符

该帖子中找到的解决方法是修改.Xmodmap并替换 keysymnames 的 Unicode 十六进制代码。

在上面的帖子中,对于希腊ifonlyif字符,发布者替换了以下行:

键码 58 = m M m M 百分比 Greek_mu KP_1 KP_1如果仅如果

按行:

键码 58 = m M m M 百分比 Greek_mu KP_1 KP_1U21D4

由于没有您的环境,我猜想在您的示例中,您应该将键码 38 的文本替换hebrew_shin为 U05E9(或类似内容)。

如果这对您有用,您需要对所有希伯来字母执行相同的操作,不幸的是,这将非常痛苦。如果您很幸运,unicode 十六进制代码可能已经在 Xmodmap 中提及,因此您可以通过一些sed魔法来完成。

答案3

部分答案:

如果你比较a一下ש,你会发现

XLookupString gives 1 bytes: (61) "a"

对阵

XLookupString gives 0 bytes: 

这就是问题所在,因为看看手册页,XLookup字符串仅处理 Latin-1,因此依赖 XLookupString 将按键转换为字符的应用程序将得到空结果,这会导致“希伯来字符无法注册,而标点符号却可以注册”。

显然,一些其他应用程序(例如 KDE 应用程序)解决了这个问题或使用了不同的方法。

我不知道如何修复这个问题。您需要使用能够识别 Unicode/UTF-8 的应用程序,并且正确翻译收到的键盘符号。修补无法正常工作的应用程序的源代码是一种选择,但如果这很容易,我相信有人已经这样做了……所以我假设其中存在一些陷阱。

XLookupString使用 UTF-8 的替代方案(Xutf8LookupString) 确实存在。

相关内容