我认为这就是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();
}
所以...这只是对我的测试数据进行正确编码的问题。
答案 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();