如何使用StringInfo计算组合字符序列

本文关键字:字符 组合 计算 何使用 StringInfo | 更新日期: 2023-09-27 18:25:55

我本以为这就是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
文本元素: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();
    }

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

如何使用StringInfo计算组合字符序列

我认为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();