Расчет длины SMS / частей C #

Меня попросили помочь другу в его приложении, в котором есть индикатор / счетчик, который должен показывать конечному пользователю, сколько символов было написано в текстовом поле, а также сколько частей в этом написанном тексте / SMS ?.

Самая простая часть заключалась в получении текущего количества / длины символов с помощью TextBox1.Text.Length, но другая часть, которая отвечала за получение количества частей в этом тексте SMS, в зависимости от арабского / Unicode и английского языка / 7Bit, и каждый язык имеет разные спецификации на стороне GSM, так как одно сообщение на арабском языке содержит максимум 70 символов и 67 символов для составных частей, а для английского языка это 160 символов для отдельной части и 153 для составные части.


person Ahmed Negm    schedule 28.06.2017    source источник


Ответы (1)


У нас было два варианта, первый заключался в том, что мы получали SMS от оператора мобильной связи с параметром кодировки, который помог нам определить язык сообщения, если это был 7 бит или Unicode < / strong>, поэтому было легко проверить данное значение параметра кодировки и продолжить проверку на 160 или 70, а другой вариант заключался в том, чтобы иметь нашу собственную программу проверки языка. В любом случае, мы использовали приведенный ниже код, и он отлично работает:

public int CalculateSmsLength(string text)
{
    if (IsEnglishText(text))
    {
        return text.Length <= 160 ? 1 : Convert.ToInt32(Math.Ceiling(Convert.ToDouble(text.Length) / 153));
    }

    return text.Length <= 70 ? 1 : Convert.ToInt32(Math.Ceiling(Convert.ToDouble(text.Length) / 67));
}

public bool IsEnglishText(string text)
{
    return Regex.IsMatch(text, @"^[\u0000-\u007F]+$");
}

Math.Ceiling возвращает наименьшее целое число, большее или равное указанному числу.

P.S. У нас было приложение, которое обнаруживало данный текст, если он был в кодировке 7Bit или Unicode, но это длинный код, и позже мы разместим его под соответствующим заголовком.

person Ahmed Negm    schedule 28.06.2017
comment
Ваша функция IsEnglishText также возвращает false для таких символов, как Ü, Ǘ и т. Д., Которые являются латинскими и поэтому закодированы в GSM7, а не в UTF-16. Таким образом, имя функции будет правильным, но расчет сегментов SMS не будет точным при использовании для символов, подобных упомянутым. - person josibu; 03.02.2021
comment
При этом не учитывается то, что некоторые символы GSM7 (|^€{}[]~) требуют escape-символов и поэтому при передаче занимают два символа. - person Kal Zekdor; 04.04.2021