如何计算字符序列与StringInfo的组合

时间:2014-10-07 20:07:17

标签: c# unicode combining-marks

我认为这就是LengthInTextElements属性的用途。 MSDN表示此属性为:

  

此StringInfo对象中的基本字符,代理项对和组合字符序列的数量。

所以看起来它应该将组合序列计为单个字符。但要么它不起作用,要么我从根本上误解了一些东西。这个糟糕的测试程序......

static void Main(string[] args)
    {
        string foo = "\u0301\u0065";
        Console.WriteLine(string.Format("String:\t{0}", foo));
        Console.WriteLine(string.Format("Length:\t{0}", foo.Length));
        Console.WriteLine(string.Format("TextElements:\t{0}", new StringInfo(foo).LengthInTextElements));
        Console.ReadLine();
    }

生成此输出......

  

字符串:`e
  长度:2
  TextElements:2

我非常希望将组合序列“\ u0301 \ u0065”计为单个字符。可以用StringInfo吗?


好吧,我弄清楚我做错了什么,这有点令人尴尬。我正在颠倒角色和变音符号的顺序。因此,进行以下微小的改变可以解决问题:

static void Main(string[] args)
    {
        string foo = "\u0065\u0301";
        Console.WriteLine(string.Format("String:\t{0}", foo));
        Console.WriteLine(string.Format("Length:\t{0}", foo.Length));
        Console.WriteLine(string.Format("TextElements:\t{0}", new StringInfo(foo).LengthInTextElements));
        Console.ReadLine();
    }

所以...这只是对我的测试数据进行正确编码的问题。

1 个答案:

答案 0 :(得分:0)

我不认为这可以使用StringInfo完成,该方法不仅仅返回组合字符。您可以轻松编写扩展方法来执行您想要的操作。类似的东西:

/// <summary>
/// determine number of combining characters in string
/// </summary>
/// <param name="input"><see cref="System.String"/>string to check</param>
/// <returns>integer</returns>
public static int NumberOfCombiningCharacters(this string input)
{
    return input.Where(c => c >= 768 && c <= 879).Count();            
}

然后调用扩展方法:

string foo = "\u0301\u0065";
int a = foo.NumberOfCombiningCharacters();