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 段的一部分。然后单词正确分开显示。
我有一个使用包括报表在内的 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 段的一部分。然后单词正确分开显示。