我使用的是双键盘布局的 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) 确实存在。