1

我原以为这就是 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();
    }

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

4

1 回答 1

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();
于 2014-10-07T21:57:45.007 回答