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