如何使用 Unicode 在从右到左的文本上排列拉丁和弦名称?

How do I use Unicode to line up latin chord names over right-to-left text?

我想显示一些阿拉伯语歌词的和弦。在英语中,我使用的是一种常用的系统,使用 monospaced 字体,并使用 spaces 排列和弦,如下所示:

 G    C      D
 From all my heart

在阿拉伯语中,这样做有困难,因为阿拉伯语是从右到左的,但和弦是从左到右的。这是我在图片中寻找的结果:

此外,我希望用户能够按逻辑顺序输入和弦和歌词。用户应先键入 G,然后键入 C,然后键入 D。我可以使用特殊的 Unicode 字符,但不能更改逻辑顺序。

我试过这个:

<div dir="rtl" style="font-family: monospace">
  G
  C
  D
  <br>
من كل قلبي  
</div>

(在此示例中,我利用 HTML 将换行符视为 space,以明确和弦的顺序。)

如您所见,当您 运行 按逻辑顺序输入的片段、和弦以错误的顺序显示。 Unicode 算法识别出这些是由 space 分隔的从左到右的词,因此从左到右显示它们,即使整个上下文是从右到左的。有什么办法可以在 Unicode 中关闭此行为?

让我们尝试使用 U+202B RIGHT-TO-LEFT EMBEDDING,使用 U+202C POP DIRECTIONAL FORMATTING 终止块:

<div dir="rtl" style="font-family: monospace">
  &#x202B;
  G
  C
  D
  &#x202C;
  <br>
من كل قلبي  
</div>

不,这行不通。 U+202B 只影响 weak 字符,像 !. 这样没有继承方向性的字符。字符 GCD 继承了从左到右的方向性,因此它们不受影响。

好的,那么,让我们尝试使用 U+202E RIGHT-TO-LEFT OVERRIDE,再次使用 U+202C 终止块:

<div dir="rtl" style="font-family: monospace">
  &#x202E;
  G
  C
  D
  &#x202C;
  <br>
من كل قلبي  
</div>

哇哦!这最终起作用了,给出了问题图像中的结果。不幸的是,它不太管用,因为它会强制同一个词中的字符从右到左移动,这对小调和弦来说是个问题:

<div dir="rtl" style="font-family: monospace">
  &#x202E;
  Gm
  Cm
  Dm
  &#x202C;
  <br>
من كل قلبي  
</div>

要解决这个问题,您需要使用 U+202D LEFT-TO-RIGHT OVERRIDE,此外,代码如下:

<div dir="rtl" style="font-family: monospace">
  &#x202E;
  &#x202D;Gm&#x202C;
  &#x202D;Cm&#x202C;
  &#x202D;Dm&#x202C;
  &#x202C;
  <br>
من كل قلبي  
</div>