Ock*_*kie 5 arrays right-to-left ios left-to-right swift
输入:
\ntempTextArray:\n\xe2\x96\xbf 3 个元素
\n- 0 : "\xd7\x96\xd7\x94 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f"\n- 1 : "7 x 5 abc"\n- 2 : "other text"\nRun Code Online (Sandbox Code Playgroud)\n当做一个简单的tempText = tempTextArray.joined(" | ")结果时,结果并没有将所有元素放置在我期望的位置...结果:
Printing description of tempText:\n"\xd7\x96\xd7\x96\xd7\x94 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f | 7 x 5 abc | other text"\nRun Code Online (Sandbox Code Playgroud)\n这是我第一次将从右到左与从左到右的文本结合起来,以前有人处理过类似的情况吗?
\n我的应用程序正在从后端接收翻译,因此我不知道哪些元素被翻译成(在本例中)希伯来语,以及我将以默认语言(英语)收到哪些元素
\n这是由Unicode BIDI(双向文本)算法引起的引起的。首先,我将解释如何修复它,因为它相当简单,然后我将解释发生了什么,以防您需要更多信息。
\n您需要在每个想要将文本方向重置为 LTR 的位置添加 LTR(从左到右标记)字符。在你的情况下,它位于字符串的开头和每个的开头|块的开头:
let ltr = "\\u{200e}"\nlet tempText = ltr + tempTextArray.joined(separator: "\\(ltr) | ")\n// => \xe2\x80\x8e\xd7\x96\xd7\x94 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f\xe2\x80\x8e | 7 x 5 abc\xe2\x80\x8e | other text\nRun Code Online (Sandbox Code Playgroud)\n如果您要使用希伯来语,您绝对想阅读 Cal Henderson 对算法的精彩解释:Understanding Bi Direction (BIDI) Text in Unicode。
\n现在解释一下发生了什么。您正在打印一个字符串,其第一个字符是“\xd7\x96\xd7\x94\xd7\x9e\xd7\x91\xd7\x97\xd7\x9f”中的最后一个字符,最后一个字符是“text”中的\xd7\x96最后一个字符t”。它不是用 分隔的三个字符串|,它只是一个长字符串。当您显示该字符串时,BIDI 算法必须决定所有字符的去向。
第一个字符 (\xd7\x96) 是 RTL 字符,因此它确定这是嵌入了一些 LTR 文本的 RTL 字符串。这与你想要的相反。您希望这是一个嵌入了一些 RTL 文本的 LTR 字符串。因此,您需要从 LTR 字符开始,例如从左到右标记。
\nBIDI 算法的工作是告诉系统下一个字符应该朝哪个方向移动。\xd7\x96\xd7\x94 中的每个字符都是 RTL,所以很简单,继续向左走。但是 \xd7\x96\xd7\x94 和 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f 之间的空格呢?空格在方向上是中性的,最后一个字符是 RTL,所以空格向左移动。但接下来我们来到 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f 和 | 之间的空格。空间是中性的并且| 是中性的,因此 BIDI 算法会将空格和 | 放在一起 再次向左。您想要空间和 | 要成为 LTR,因此您需要在那里添加另一个 LTR 字符。
\n7 也是中性的,但x它是拉丁文小写字母 X,即 LTR(不是中性的 MULTIPLICATION X)。
最终结果是 BIDI 算法确定这是一个 RTL 字符串,该字符串开始 7 | \xd7\x96\xd7\x94 \xd7\x9e\xd7\x91\xd7\x97\xd7\x9f后(左侧)是嵌入的 LTR 字符串x 5 abc | other text。(换句话说,这是一个恰好包含一些英语的希伯来语字符串,而不是一个恰好包含一些希伯来语的英语字符串。)
我希望您上面的问题中实际显示的内容不是您所看到的(因为 BIDI 算法在 Stack Overflow 上的应用方式)。我希望它实际上看起来像这样:
\n\n如果你从右到左阅读这篇文章,你应该会更明白现在发生的事情。
\n| 归档时间: |
|
| 查看次数: |
487 次 |
| 最近记录: |