如何使用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不能做到这一点,该方法所做的不仅仅是返回组合字符。您可以很容易地编写一个扩展方法来执行您想要的操作。类似于:
/// <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();