Как рассчитывать комбинирование символьных последовательностей с помощью StringInfo

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
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();
    }

Итак... это просто вопрос правильной кодировки моих тестовых данных.

Теги:
unicode
combining-marks

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();
  • 0
    Просто чтобы вы знали, что я использовал от 0300 до 036f для диапазона и преобразовал их в целые. Если вам нужен другой диапазон, это должно быть легко выяснить.
  • 0
    Я не должен был правильно поставить вопрос. Мне не интересно знать, сколько объединяющих последовательностей находится в строке; Я заинтересован в правильном подсчете количества символов в строке, которая содержит объединяющие последовательности, где что-то вроде ase̽ считается одним символом. Фактически это то, что StringInfo.LengthInTextElements должен делать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню