将 RTL 语言音译为 LTR 语言的通用(粗略)算法

General (rough) algorithm for transliterating a RTL language to a LTR language

我开始思考如何transliterate a RTL string (i.e. arabic, hebrew) to a LTR string (i.e. the romanization了sounds/letters)。如果它是 LTR -> LTR,它相对简单,但对于 RTL -> LTR,它在精神上更棘手。对于 LTR -> LTR,您可以将 A 中的每个字母映射到 B 中的每个字母。在某些情况下,可能多个 A 的组合构成一个 B,或者单个 A 构成一连串的 B。

a        b
-        -
X        1
YZ       2
ABC      3
D        456
E        78

然后给定一个像 XYZYZDDEABC 这样的字符串,你会得到 122456456783。足够基本了,尽管实际的算法会有点棘手,因为它可能必须向前看并对元素进行优先级排序。但这就是它的要点。

现在对于 RTL -> LTR 转换,我在两个层面上感到困惑。首先,如何遍历 RTL 字符串?这些字符按 LTR 顺序 实际上 ,对吗?只是浏览器中的视觉布局等使其成为 RTL。因此,从代码的角度来看,您的 RTL 语言实际上是 read LTR(我们不需要做任何相反的事情或任何事情)。只是确保我正确地解释了这一点。这意味着我可以像上面的 LTR -> LTR 转换一样进行所有意图和目的。

如果不是这样,并且还有其他需要考虑的事情,我想大致了解一下该怎么做。如果演示需要一种语言,那么 JavaScript 会很好。

你是对的。文本存储在 "logical order" 中,这是输入的顺序(或者,在大多数情况下,是说话的顺序)。所以在音译过程中不需要考虑方向性。

请注意,在许多书写系统中,包括阿拉伯语和希伯来语,数字都写成 "big-endian",最重要的数字在左边。它们也按此顺序输入,这意味着文本实际上是双向的。当不同方向的文本混合在一起时也是如此,例如当用拉丁字母书写的名字包含在阿拉伯语或希伯来语文档中时。幸运的是,您也不必担心这一点,除非您正在编写 Unicode 渲染器。 (如果是,则需要阅读 Annex 9 to the Unicode standard,其中详细介绍了双向渲染。)