Я бы подумал, для чего было свойство 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();
}
Итак... это просто вопрос правильной кодировки моих тестовых данных.
Я не думаю, что это можно сделать с помощью 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();