2

正如我所期望的那样,我很难让双向字符串在 HTML 文本区域内工作。

此测试字符串包含阿拉伯语和英语,以及伪标签序列(<1/>、<2/>),它们由中性方向字符(<、>、/、数字)组成,并应通过以下方式继承其方向他们面前的强方向角色。

鉴于这些伪标签位于 RTL 和 LTR 文本之后,我需要强制文本的方向在每个伪标签之前LRM (U+200E, &lrm;)放置一个字符。

结果出乎我的意料: Textarea截图测试

请注意,textarea 的方向属性设置如下:dir='rtl'

用 Chrome 和 FF 测试,它们似乎都没有按预期工作。我错过了什么吗?

Jsfiddle 上的结果甚至不同:https ://jsfiddle.net/o7d2ymdc/1/

4

1 回答 1

1

不幸的是,如果可能的话,在文本区域中显示这些内容将非常困难。

这里有几个问题在起作用,其中一个事实是括号和括号在 Unicode 双向算法中是镜像的:这<span dir="ltr"><</span>被呈现为“<”,而这<span dir="rtl"><</span>被呈现为“>”。所有这些都是基于我们在 RTL 和 LTR 字符串中对“字符串结尾”的不同定义这一事实之上的。

您最好的选择可能是使用ContentEditable。您可以显示可编辑的富文本(实际上是 html 节点),并且基本上使用 span 将您的 RTL 片段与 HTML 标记正确隔离,就好像您将静态显示它一样。但是,如果此文本框允许自定义用户生成的文本,您可能需要想出一个很好的算法,在用户键入时自动包装双向文本,这可能是一个很大的挑战。

如果这有帮助,那么您不是唯一处理此问题的人。例如,如果您在阿拉伯语 Wikipedia中编辑 HTML 块,您将看到完全相同的问题(这使得编辑 HTML 和 wikitext 成为一个相当大的挑战)

这个问题也是人们喜欢 WYSIWYG 编辑器的原因之一——它在标记/样式和文本本身之间具有适当的上下文和概念分离。

于 2017-01-15T02:08:32.073 回答