RTL 和 LTR 字符串之间错位的空格

Misplaced spaces between RTL and LTR strings

我有一个使用包括报表在内的 DevExpress 控件构建的网站。使用的主要语言是希伯来语,所以基本方向是 RTL。然而,通常需要将英文文本 LTR 混入希伯来文文本中。他们的 web 控件支持 RTL,通常混合文本没有问题。

问题在于他们的报告直到最近才支持 RTL。完全用希伯来语创建报告不是什么大问题。当我们将希伯来语和英语混在一起时,麻烦就开始了,然后文本变得一团糟。

我使用以下代码成功解决了这个问题:

private string FixBiDirectionalString(string textToFix)
    {
        try
        {
            char RLE = '\u202B';
            char PDF = '\u202C';
            char LRM = '\u200E';
            char RLM = '\u200F';

            StringBuilder sb = new StringBuilder(textToFix.Replace("\r", "").Replace("\n", string.Format("{0}", '\u000A')));

            System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("[A-Za-z0-9-+ ]+");
            System.Text.RegularExpressions.MatchCollection mc = r.Matches(sb.ToString());
            foreach (System.Text.RegularExpressions.Match m in mc)
            {
                double tmp;
                if (m.Value == " ")
                    continue;
                if (double.TryParse(RemoveAcceptedChars(m.Value), out tmp))
                    continue;
                sb.Replace(m.Value, LRM + m.Value + RLM);
            }

            return RLE + sb.ToString() + PDF;
        }
        catch { return Text; }

    }

    private string RemoveAcceptedChars(string p)
    {
        return p.Replace("+", "").Replace("-", "").Replace("*", "").Replace("/", "");
    }

此代码基于我在这篇文章 XtraReports RTL: bidirectional text drawing 的其中一条评论中找到的代码。

但是我仍然遇到希伯来语和英语单词之间的空格消失或错位的问题。

如何解决? (我仍在使用不支持 RTL 的旧版报告)。

我通过首先修剪匹配英文字母正则表达式的字符串中的前导和尾随 space 来修复它,然后根据 unicode 元素相应地添加 space。

  string mTrim = m.Value.Trim();
  sb.Replace(m.Value, " " + LRM + mTrim + " " + RLM);

这个问题是因为 space 是中性的或弱方向的,这意味着它们的方向取决于它们所在的文本,这里混合的文本会导致 space错位。所以这段代码强制一个 space 成为一般 RTL 方向的一部分,一个成为 LTR 段的一部分。然后单词正确分开显示。