【问题标题】:Misplaced spaces between RTL and LTR stringsRTL 和 LTR 字符串之间的空格错位
【发布时间】:2018-08-28 02:17:49
【问题描述】:

我有一个使用 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 在其中一个 cmets 中找到的代码。

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

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

【问题讨论】:

    标签: c# unicode devexpress bidi


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 2016-12-15
      • 2020-10-27
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多