C# 如何区分文本并相应地更改对齐

C# 如何区分文本并相应地更改对齐,c#,windows,form-control,C#,Windows,Form Control,我有一个要求,我有一个文本字段,我从数据库中获取数据。它可以是阿拉伯语或英语。我想动态地区分它,并相应地更改对齐方式。也就是说,如果文本是阿拉伯语,它应该是从右到左,或者从左到右 如果文本包含,则Windows会为您执行此操作 否则,您只需在以下位置检查字符(不要忘记System.Char表示代码单元,而不是代码点,但在本例中,这不是问题): 如果文本包含,则Windows会为您执行此操作 否则,您只需在以下位置检查字符(不要忘记System.Char表示代码单元,而不是代码点,但在本例中,这不

我有一个要求,我有一个文本字段,我从数据库中获取数据。它可以是阿拉伯语或英语。我想动态地区分它,并相应地更改对齐方式。也就是说,如果文本是阿拉伯语,它应该是从右到左,或者从左到右

如果文本包含,则Windows会为您执行此操作

否则,您只需在以下位置检查字符(不要忘记
System.Char
表示代码单元,而不是代码点,但在本例中,这不是问题):

如果文本包含,则Windows会为您执行此操作

否则,您只需在以下位置检查字符(不要忘记
System.Char
表示代码单元,而不是代码点,但在本例中,这不是问题):


如果阿拉伯文字符数大于英文字符数,则可以说文本为阿拉伯文

您可以使用


如果阿拉伯文字符数大于英文字符数,则可以说文本为阿拉伯文

您可以使用


如果文本包含RTL标记,则Windows会为您执行此操作。否则,您只需在中检查字符(别忘了System.Char代表代码单元,而不是代码点),也许您可以在DB中为RTL文本添加列标志。如果文本不包含RTL标记,则Windows仍会为您这样做。然而,如果文本混合了阿拉伯语字形和西方标点符号或数字,情况就会变得很困难。这在添加数据库内容的程序中得到了最好的解决,因为它(应该)知道文本的实际含义。@Hans Windows将正确地将文本追加到左侧(而不是右侧),并保持右侧字符的顺序,但不会使其右对齐(RTL输入应该如此)。如果文本包含RTL标记,则Windows会为您执行此操作。否则,您只需在中检查字符(别忘了System.Char代表代码单元,而不是代码点),也许您可以在DB中为RTL文本添加列标志。如果文本不包含RTL标记,则Windows仍会为您这样做。然而,如果文本混合了阿拉伯语字形和西方标点符号或数字,情况就会变得很困难。这在添加数据库内容的程序中得到了最好的解决,因为它(应该)知道文本的实际含义。@Hans Windows将正确地将文本追加到左侧(而不是右侧),并保持右侧字符的顺序,但不会使其右对齐(RTL输入应该如此).命名类的捕获很好(比硬编码的范围可读性强得多),但字符计数确实过于工程化和随意。依我看,如果有一个阿拉伯字符(或另一个RTL字母),那么它是阿拉伯语,应该是RTL。顺便说一句,IsBasicLatin(从\u0000到\u007f)还包括许多常见的符号和数字(通常也用在阿拉伯语文本中,而不是阿拉伯-印度数字)。命名类的捕捉效果很好(比硬编码范围可读性强得多),但计数字符确实过于工程化和随意。依我看,如果有一个阿拉伯字符(或另一个RTL字母),那么它是阿拉伯语,应该是RTL。顺便说一句,IsBasicLatin(从\u0000到\u007f)还包括许多常用符号和数字(通常也用于阿拉伯语文本,而不是阿拉伯-印度数字)。
public bool IsArabic(string text)
{
    return Regex.IsMatch(text, "[\u06000-\u06FF]")
}
    public bool IsArabic(this string input)
    {
        var isArabic = Regex.Matches(input, "\\p{IsArabic}");
        var isLatin = Regex.Matches(input, "\\p{IsBasicLatin}");

        if (isArabic == null)
            return false;

        if (isLatin == null)
            return true; //suggest that there is no another character types

        if (isArabic.Count > isLatin.Count)
            return true;

        return false;
    }