如何在文本小部件中正确显示希伯来语?

How to properly display Hebrew in text widget?

我正在使用 Manjaro Linux KDE 和最新版本的 Tcl 和 Tk,并试图在文本小部件中显示希伯来语。在测试中,希伯来文本被粘贴到 Kate 文本编辑器的 Tcl 脚本中,并以正确的顺序显示,从右到左显示复合字符。

在 Tcl/Tk 中没有使用特定字体,文本从左到右打印并分隔复合字符的组成部分,这样元音点和悬音标记就显示为单独的字符。使用SBL Hebrew font后,字看起来好多了,但元音点位置不对,仍然是从左到右写的。我尝试使用 \u200f\u200e 标记,但没有任何区别;但我真的不知道我在那里做什么,只是尝试在希伯来语单词上加上前缀和后缀。反转字符串有帮助,但元音点未与辅音结合。

我没有使用 Tkinter,但这个较旧的 似乎表明它是 Tcl 的 Linux 问题。

如果我使用 Tcl 从 SQLite 中提取希伯来语并使用 puts 将其写入命令行,它会正确显示。此外,如果我从 Tk 文本小部件复制反转文本并将其粘贴到这个 SO 问题中,它会以正确的顺序显示。澄清一下,在这里反转,我并不是说使用 string reverse,只是它在 Tk 中出现反转,但是当粘贴到这个 SO 框中时,它显示正确。

你能告诉我我做错了什么以及如何让它正确显示吗?

我试图遵循显示多种语言(包括希伯来语)的 document on internationalization in Tcl and encoding but don't follow how this affects displaying Hebrew in a text Widget. I also came across a web site that has code for a unicode editor,但我也无法遵循该代码。我尝试了 运行 代码,如果 select 希伯来语,它从右到左书写,但我没有看到元音点或悬音符号;但我对希伯来语的输入了解不多。

谢谢。

.tw tag configure heb -font {"SBL Hebrew" 18 normal}
.tw insert end "בְּרֵאשִׁ֖ית" "heb"
# Also tried "בְּרֵאשִׁ֖ית\u200f" and "\u200fבְּרֵאשִׁ֖ית".
# and "בְּרֵאשִׁ֖ית\u200e" and "\u200eבְּרֵאשִׁ֖ית".
# Tried .t insert end [string reverse $h ] "heb", which order the 
# consonants but the vowel points and cantillation marks are not correct.

这是正确的渲染。

这是来自Tk。第一个是正常顺序,第二个使用字符串反转。可以看出,元音点不在辅音上,悬音符号也不正确。我对希伯来语知之甚少,但我可以看出它们不匹配,而且似乎是作为单独的字符而不是组合打印的。我认为在希伯来字母下看起来像“t”但看起来类似于“W”的是两个字符在彼此之上——一个点和符号有点类似于正确渲染中的左括号。

不知道为什么,重启安装下一批更新后,跟Tk没有关系,不设置字体的时候渲染不一样。但是,一旦设置了 SBL 希伯来语字体,字符就会如上所示分隔。

我可以告诉你,在 macOS 上使用 Tk 呈现的文本非常接近正确(我不确定有多少只是字体差异,并且有一些我不知道的下行装饰剪裁喜欢,但我不认为 Tk 本身做错了事)。

这意味着 这绝对是您看到的渲染错误。我 怀疑 它可能与输入渲染器的字符块的大小有关;如果 renderer 的低级别一次只被赋予一个字符,那么他们就没有机会获得正确的整体位置或应用任何字符组合。我猜真正的问题是 TkpDrawCharsInContext() 只是调用 Tk_DrawChars(),如果我对评论的阅读是正确的话。 (相比之下,macOS 渲染器在这里做了一些不同的事情。)

我没有解决方法。