Xterm.js: 支持 RTL 语言

创建于 2017-06-13  ·  17评论  ·  资料来源: xtermjs/xterm.js

下游问题: https :

当我们在https://github.com/sourcelair/xterm.js/issues/467 中强制使用 unicode 字符宽度时,这破坏了 RTL 语言字符,因为它们现在是反向渲染 (LTR)。 我们可以只为 RTL 字符范围恢复它,但我们应该做正确的修复并反转字符串,这样它们实际上就在字符网格上,因为新的选择模型依赖于在网格https://github上完美排列的所有字符

理想情况下,线路回流https://github.com/sourcelair/xterm.js/issues/622将在此之前完成,因此更容易更改多行的内容。

终端应用程序:

image

VS Code 1.13(注意语句颠倒):

image

@mostafa69d @CherryDT有关相关语言的一些信息会很方便:

  1. 字符串应该在哪里翻转。对于希伯来语/阿拉伯语/波斯语,我是否反转了 ascii 字符之间的整个连续字符序列?
  2. 字符如何与 0-9 或标点符号等字符交互?

有用的参考:

arei18n arerenderer typenhancement

最有用的评论

@泰瑞尔
首先,我会给你一个非常简短的阿拉伯语和波斯语的视角,也许对你有帮助(我不确定希伯来语是否相同)。
在阿拉伯语和波斯语中,字母类似于“آ”“ب”“س”等。 并且单词是由这些字母(显然)与例如英语相比具有非常不同的规则。
不同之处在于,对于某些字母,例如“س”,我们有多个形状。第一个形状是“س”,第二个是“سـ”,另一个是“ـسـ”,最后一个是“ـس”。 这些形状的用途是什么? 根据单词中字母出现的位置,我们使用的字母形状会有所不同。 例如,对于提到的字母“س”,当单词以“سلام”开头时,我们使用形状“سـ”。 这是问题,实际上是英语和波斯语或阿拉伯语等语言之间的区别。 我们通过连接这些字母表的不同形状来生成这些语言的单词(在某些情况下我们将它们粘在一起)。 我再次强调这些规则:我们通过连接形状而不是字母(英语中总是连接字母)来生成这些单词,您可以在下面看到一些示例:
我们有字母“ک”“ن”“ا”“د”“ی”
我用刚才提到的字母来写这些词: نادان , یاد, دکان
所以,总结一下,给你我发布的截图中发生了什么的线索,终端将单词分解为字母并将它们反转。(所以这不仅仅是反转)。 看看我之前创建的单词和字母表,现在VS终端显示它们“分离”和“反转”。

正确格式: نادان 终端: ن ا د ا ن
正确格式: Ìاد 终端: د ا ی
正确格式: دکان 终端: ن ا ک د

现在你的问题:
字符串应该在哪里翻转。对于希伯来语/阿拉伯语/波斯语,我是否反转了 ascii 字符之间的整个连续字符序列?
我对希伯来语一无所知,但在阿拉伯语和波斯语中,当遇到空格字符(单词分隔符是空格)时,字符序列应该翻转,如下所示:" من در حال نوشتن هستم" 但它仍然应该保留“形状”和必要的坚持。

字符如何与 0-9 或标点符号等字符交互?
关于数字和标点符号的规则与英语相同,数字和标点符号跟在字符后面。 像这样:
?من در سال "۱۳۶۹" به دنیا آمدم。
من در سال "1369" به دنیا آمدم。
实际上,包含 RTL 和非 RTL 字符的字符序列是一个完全不同的故事,如果您需要更多信息,我可以详细说明。

附注 1:
这里的这个链接是一个源代码,它是为了解决 PHP 中的相同问题而编写的(肯定是旧版本)你可以看看
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

附注 2:
这是维基百科上有关波斯字符的资源
https://en.wikipedia.org/wiki/Persian_alphabet

附注 3:
再次,我不得不提一下,在以前的 VS Code 版本中,一切都很好。

附注 4:
关于选择包含一些 LTR 字符的单词的问题,例如
@CherryDT提到的<p>اینجا را بخوانید</p> ,有一些小错误我没有遇到问题,我找到了快速解决方案。(但如果你需要详细说明这些,请告诉我)

所有17条评论

它实际上要复杂得多,包括状态,甚至反映某些字符。 我会说这是一门自己的科学。 (我对那些编写了能够正确处理所有 BiDi 问题的强大文本渲染库的人表示最深切的敬意,所以老实说,_I_ 不必乱搞。)

也可以看看:
https://en.wikipedia.org/wiki/Bi-directional_text (很好的概述)
https://www.w3.org/International/articles/inline-bidi-markup/uba-basics
https://www.w3.org/International/tutorials/svg-tiny-bidi/ (最初的前提不相关,但它比上一个链接更好地解释了一些事情)
https://github.com/fevangelou/doctype-mirror/tree/master/bidihowto/bidi-support-in-a-ui

编辑:我认为新选择的工作方式实际上可能出乎意料,因为它的行为将与 VSCode 本身不同。 例如,给定文本“歌曲 מדינת קומבינה 让我思考”,当我开始选择“The”并在两个希伯来语单词之间结束时,我将选择“歌曲 מדינת”,而在控制台中我将选择“歌曲קומבינה”。

见示例:
Image

然而,它仍然比我上次检查时 Sublime Text “工作”的方式要好,因为在那里你会看到选择了一个东西但复制了另一个东西,这很烦人。

@泰瑞尔
首先,我会给你一个非常简短的阿拉伯语和波斯语的视角,也许对你有帮助(我不确定希伯来语是否相同)。
在阿拉伯语和波斯语中,字母类似于“آ”“ب”“س”等。 并且单词是由这些字母(显然)与例如英语相比具有非常不同的规则。
不同之处在于,对于某些字母,例如“س”,我们有多个形状。第一个形状是“س”,第二个是“سـ”,另一个是“ـسـ”,最后一个是“ـس”。 这些形状的用途是什么? 根据单词中字母出现的位置,我们使用的字母形状会有所不同。 例如,对于提到的字母“س”,当单词以“سلام”开头时,我们使用形状“سـ”。 这是问题,实际上是英语和波斯语或阿拉伯语等语言之间的区别。 我们通过连接这些字母表的不同形状来生成这些语言的单词(在某些情况下我们将它们粘在一起)。 我再次强调这些规则:我们通过连接形状而不是字母(英语中总是连接字母)来生成这些单词,您可以在下面看到一些示例:
我们有字母“ک”“ن”“ا”“د”“ی”
我用刚才提到的字母来写这些词: نادان , یاد, دکان
所以,总结一下,给你我发布的截图中发生了什么的线索,终端将单词分解为字母并将它们反转。(所以这不仅仅是反转)。 看看我之前创建的单词和字母表,现在VS终端显示它们“分离”和“反转”。

正确格式: نادان 终端: ن ا د ا ن
正确格式: Ìاد 终端: د ا ی
正确格式: دکان 终端: ن ا ک د

现在你的问题:
字符串应该在哪里翻转。对于希伯来语/阿拉伯语/波斯语,我是否反转了 ascii 字符之间的整个连续字符序列?
我对希伯来语一无所知,但在阿拉伯语和波斯语中,当遇到空格字符(单词分隔符是空格)时,字符序列应该翻转,如下所示:" من در حال نوشتن هستم" 但它仍然应该保留“形状”和必要的坚持。

字符如何与 0-9 或标点符号等字符交互?
关于数字和标点符号的规则与英语相同,数字和标点符号跟在字符后面。 像这样:
?من در سال "۱۳۶۹" به دنیا آمدم。
من در سال "1369" به دنیا آمدم。
实际上,包含 RTL 和非 RTL 字符的字符序列是一个完全不同的故事,如果您需要更多信息,我可以详细说明。

附注 1:
这里的这个链接是一个源代码,它是为了解决 PHP 中的相同问题而编写的(肯定是旧版本)你可以看看
https://github.com/slashmili/php-gd-persian/blob/master/phpgd/fagd.php

附注 2:
这是维基百科上有关波斯字符的资源
https://en.wikipedia.org/wiki/Persian_alphabet

附注 3:
再次,我不得不提一下,在以前的 VS Code 版本中,一切都很好。

附注 4:
关于选择包含一些 LTR 字符的单词的问题,例如
@CherryDT提到的<p>اینجا را بخوانید</p> ,有一些小错误我没有遇到问题,我找到了快速解决方案。(但如果你需要详细说明这些,请告诉我)

更新我的 vscode 后,一切都颠倒了,这很糟糕,请解决这个问题
我要降级,女巫版可以吗?

@mostafa69d幸运的是在希伯来语中几乎不存在。 希伯来字母在单词内的任何位置都基本保持不变,除了少数几个字母是 כ 变成 ך,然后 מ 变成 ם,然后 נ 变成 ן,然后 פ 变成 ף 最后 צ 变成檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪. 我猜这使希伯来语更容易格式化。

然而,这些仍然是单独的字符(就字符编码而言)并且始终显示相同。 它们在四处移动时不会改变外观。 (作者的工作是在正确的位置使用正确的字母 - 无论是否合适 - 。)

拆分字符的问题是当它们一个一个地包裹在跨度内时,它需要连接并且它会错过表示形状(阿拉伯字母)。

为了解决这个问题,这些字符必须在一个跨度内或根本不包裹它们。

所有这些字母的 unicode 列表都是
阿拉伯语(0600–06FF,255 个字符)
阿拉伯语补充(0750-077F,48 个字符)
阿拉伯语扩展-A(08A0–08FF,73 个字符)
阿拉伯语演示表格-A(FB50–FDFF,611 个字符)
阿拉伯语演示表格-B(FE70–FEFF,141 个字符)
鲁米数字符号(10E60–10E7F,31 个字符)
阿拉伯数学字母符号(1EE00—1EEFF,143 个字符)
screen shot 2017-11-29 at 11 45 00 pm

必读: https :

来自https://github.com/Microsoft/vscode/issues/28571#issuecomment -307991443

你有另一个处理这个问题的终端的例子吗?

mlterm似乎比一般的(非基于网络的)终端要好。
2018-11-15-023232_577x981_scrot
它是草书,但在某些情况下被切断,我认为可以通过更改字体来解决,这一段是从维基百科复制的,蓝色字符是 RTL 标记,这就是 vim 输出它们的方式,而 mlterm 将它们呈现为蓝色。

字符连接器 API 可能能够解决这个问题,我们可能可以使所有相邻的阿拉伯语/希伯来语/等。 unicode 字符加入并绘制在相同的字形中。

值得一提的是,调试控制台可以很好地处理 RTL 文本。 这是我尝试过的:
code
这是调试控制台上的输出:
debug
但是终端还是一样:
terminal

我正在使用 VS Code - Insiders v1.31.0。

@babakks据我所知,在 Linux 系统中只有两个终端可以正确输出 RTL, konsolemlterm ,它们在所有发行版存储库中都可用。

@elieobeid7 @babakks Mac OS 终端正确输出 RTL

发布 PR 来解决这个问题,如果有人想测试有用的分支,因为我不会说这些语言。 https://github.com/xtermjs/xterm.js/pull/1899

去测试:

git clone https://github.com/Tyriar/xterm.js
cd xterm.js
git checkout 701_rtl_support
yarn
yarn watch

# another terminals
yarn start

您可能需要安装一些依赖项https://github.com/Microsoft/node-pty#dependencies

请稍等一下:)

我最近一直致力于研究、评估终端中 RTL 的现有文档和实现,并提出(草案)建议。 我会尽快发布它。

这比人们最初想象的要复杂得多。 有点剧透:如果你开始根据 BiDi 算法重新排列字符,从字面上看,数学上证明不可能在该平台上拥有正确的 BiDi 感知文本编辑查看体验(例如 vim、emacs ......) . (并回应前几条评论:不,konsole、mlterm 和 macOS 终端也不正确。)

@egmontkob这是否考虑到我们可以利用浏览器的双向支持? 我所做的所有更改都是强制将相关的 unicode 序列绘制在一起,而不是作为单独的字符绘制。 当光标位于字符上时,这可能是错误的,但除此之外似乎还可以。

@Tyriar对不起 Tyriar,但它仍然是错误的。 我在拉取请求下发表了评论。
https://github.com/xtermjs/xterm.js/pull/1899#issuecomment -455333377

规范定义了在接收到一些数据后画布需要的样子。 规范并不关心终端模拟器的后端是什么(例如图形画布、浏览器 (HTML DOM) 或另一个终端模拟器 (tmux)),终端模拟器的任务是通过任何方式实现指定的行为.

并且指定行为的一个方面是,在某些情况下,字符单元格需要根据 BiDi 算法进行洗牌(仅用于显示目的,不影响实际存储),因为这是获得“cat”等简单实用程序的唯一合理方法" 产生所需的输出; 在其他一些情况下,单元格不能重新排列,因为这是 vim/emacs/任何人都可以做自己的 BiDi 的唯一方法。 有转义序列控制此行为。 故事的意义远不止于此。

请参阅https://terminal-wg.pages.freedesktop.org/bidi/ 上已发布的 BiDi 规范草案。 在其问题跟踪器中欢迎评论、改进想法等。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

johnpoth picture johnpoth  ·  3评论

travisobregon picture travisobregon  ·  3评论

tandatle picture tandatle  ·  3评论

jerch picture jerch  ·  3评论

Tyriar picture Tyriar  ·  4评论