Подсчет символов / смс с использованием jQuery - PullRequest
9 голосов
/ 16 января 2011

Я считаю символы, используя NobleCount и следующий код:

$('#message').NobleCount('#messageInfo',{
            max_chars: getMaxChars(),
            on_negative: function(t_obj, char_area, c_settings, char_rem){

            }
});

Мне нужна такая функция, как подсчет SMS, если лимит достигнут, следующие 160 символов относятся к второму смс и так далее. Я могу использовать такие параметры, как on_update, on_positive, on_negative и block_negative.

Я пробовал что-то, используя модуль, но это не работает. Есть идеи?

Ответы [ 11 ]

40 голосов
/ 15 августа 2011

Остерегайтесь того, что SMS является более сложным, чем вы, похоже, указываете.

Стандартное "160-символьное" SMS использует странную 7-битную кодировку , которая охватывает большинство ASCII, некоторые европейские акценты,Разные символы, такие как €, некоторые заглавные греческие буквы (те, которые не похожи на латинские символы).

Если ваше сообщение использует другие символы, его можно вместо этого закодировать как Unicode, используя UCS-2 (например, UTF)-16, но только BMP), не более 70 символов.На самом деле, спецификация говорит UCS-2, но эмодзи (не-BMP Unicode) можно отправлять в SMS, так что подразумевается, что используется UTF-16 , и в этом случае каждый смайлик должен«использовать» 2 символа из общего числа 70.

Но некоторые языки могут использовать «таблицы смены национальных языков» , которые используют альтернативное 7-битное кодирование.В первую очередь турецкий, но также испанский, португальский и десять индийских субконтинентальных языков.Это относительно новые дополнения к стандарту.

Даже в 7-битной кодировке несколько символов «экранированы», что означает, что они «используют» 2 символа.В стандартной 7-битной кодировке это: {}[]\|^~€.

Если ваше сообщение превышает 160 символов, оно может использовать «сцепленное SMS», но затем к каждому сообщению добавляется небольшой заголовок, то есть каждыйВ сегменте есть место только для 153 символов.Существуют две разные версии этого заголовка разных размеров, поэтому это может быть не 153 символа, а 152 (из памяти).Точно так же для соединенных SMS Unicode маленький заголовок составляет 67 символов на сегмент.

Удачи вам во всем этом!

25 голосов
/ 16 января 2011

Во-первых, подсчет символов очень прост.Вам просто нужно использовать свойство length для строки.Чтобы подсчитать количество необходимых SMS-сообщений, вам нужно разделить их на 160 и округлить (поскольку для 161 символа требуется 2 сообщения).Ваш код должен выглядеть примерно так:

HTML:

<textarea name="message" value="" id="message"></textarea>
<p>
    <span id="remaining">160 characters remaining</span>
    <span id="messages">1 message(s)</span>
</p>

jQuery:

$(document).ready(function(){
    var $remaining = $('#remaining'),
        $messages = $remaining.next();

    $('#message').keyup(function(){
        var chars = this.value.length,
            messages = Math.ceil(chars / 160),
            remaining = messages * 160 - (chars % (messages * 160) || messages * 160);

        $remaining.text(remaining + ' characters remaining');
        $messages.text(messages + ' message(s)');
    });
});

См. Пример jsFiddle.

11 голосов
/ 22 февраля 2014

Вот небольшой плагин для вас.Это мой первый плагин jQuery, который я даю бесплатно;) Вам просто нужно запустить его с:

$('#smsText').smsArea();

HTML:

 <b id="smsCount"></b> SMS (<b id="smsLength"></b>) Characters left
 <textarea id="smsText"></textarea>

Javascript (обновлено 18.8.2014):

(function($){
    $.fn.smsArea = function(options){

    var
    e = this,
    cutStrLength = 0,

    s = $.extend({

        cut: true,
        maxSmsNum: 3,
        interval: 400,

        counters: {
            message: $('#smsCount'),
            character: $('#smsLength')
        },

        lengths: {
            ascii: [160, 306, 459],
            unicode: [70, 134, 201]
        }
    }, options);


    e.keyup(function(){

        clearTimeout(this.timeout);
        this.timeout = setTimeout(function(){

            var
            smsType,
            smsLength = 0,
            smsCount = -1,
            charsLeft = 0,
            text = e.val(),
            isUnicode = false;

            for(var charPos = 0; charPos < text.length; charPos++){
                switch(text[charPos]){
                    case "\n": 
                    case "[":
                    case "]":
                    case "\\":
                    case "^":
                    case "{":
                    case "}":
                    case "|":
                    case "€":
                        smsLength += 2;
                    break;

                    default:
                        smsLength += 1;
                }


                if(text.charCodeAt(charPos) > 127 && text[charPos] != "€") isUnicode = true;
            }

            if(isUnicode){
                smsType = s.lengths.unicode;

            }else{
                smsType = s.lengths.ascii;
            }

            for(var sCount = 0; sCount < s.maxSmsNum; sCount++){

                cutStrLength = smsType[sCount];
                if(smsLength <= smsType[sCount]){

                    smsCount = sCount + 1;
                    charsLeft = smsType[sCount] - smsLength;
                    break
                }
            }

            if(s.cut) e.val(text.substring(0, cutStrLength));
            smsCount == -1 && (smsCount = s.maxSmsNum, charsLeft = 0);

            s.counters.message.html(smsCount);
            s.counters.character.html(charsLeft);

        }, s.interval)
    }).keyup()
}}(jQuery));

DEMO: http://jsfiddle.net/t32h0gj4/1/

ПРИМЕЧАНИЕ: есть несколько основных опций

$('#smsText').smsArea({cut:false}); //Do not cut the SMS
$('#smsText').smsArea({maxSmsNum:2}); //2 SMS Max
3 голосов
/ 16 февраля 2012

После того, как сообщение было декодировано, как указано в сообщении этой темы Крейгом Маккуином, и у вас есть действительное количество символов, для подсчета необходимой суммы SMS достаточно:

function cntsms(len){ return len<=0? 0: (len>160? Math.ceil(len/153): 1); }

... Мне очень нравятся однорядные решения.

2 голосов
/ 06 марта 2012

Каждый символ из таблицы расширений (расширенный алфавит GSM) представлен двумя символами, фактическая максимальная длина динамически рассчитывается как: 160 - k, где k - количество расширенных символов, используемых в сообщении.

Вы также должны учитывать, что длина сообщения составляет 153 символа при объединении сообщений с 8-битным ссылочным номером.

Длина Unicode - 70 символов, а сцепленных 63 символов.

2 голосов
/ 25 февраля 2012

Я думаю, что следующий скрипт может произвести более точный расчет частей SMS:

//field: a text box that contains the SMS Text
//cntField: a text box that will contain the remaining count of characters for each part
//smsCntfield: a text box that will contain the count of parts
//lang: 0 for English, 2 for Arabic
//maxLimit: Maximum count of characters to limit the TextBox, (ex: for 5 SMS in Arabic 331, in English 762
function textCounter(field, cntfield, smsCntfield, lang, maxlimit) {

    part1Count = 0;
    part2Count = 0;
    part3Count = 0;
    part4Count = 0;
    part5Count = 0;
    if (lang == 2) {
        // Arabic
        part1Count = 70;
        part2Count = 63;
        part3Count = 66;
        part4Count = 66;
        part5Count = 66;
    } else if (lang == 0) {
        // English
        part1Count = 160;
        part2Count = 145;
        part3Count = 152;
        part4Count = 152;
        part5Count = 152;
    }

    smsCount = 0;
    smsCharCnt = 0;
    smsTotalCount = 0;

    if (field.value.length <= part1Count) {
        smsCount = 1;
        smsCharCnt = part1Count;
        smsTotalCount = part1Count;
    } else if (field.value.length <= (part1Count + part2Count)) { 
        smsCount = 2;
        smsCharCnt = part2Count;
        smsTotalCount = (part1Count+part2Count);
    } else if (field.value.length <= (part1Count+part2Count+part3Count)) {
        smsCount = 3;
        smsCharCnt = part3Count;
        smsTotalCount = (part1Count+part2Count+part3Count);
    } else if (field.value.length <= (part1Count+part2Count+part3Count+part4Count)) { 
        smsCount = 4;
        smsCharCnt = part4Count;
        smsTotalCount = (part1Count+part2Count+part3Count+part4Count);
    } else if (field.value.length <= (part1Count+part2Count+part3Count+part4Count+part5Count)) { 
        smsCount = 5;
        smsCharCnt = part5Count;
        smsTotalCount = (part1Count+part2Count+part3Count+part4Count+part5Count);
    }

    if (field.value.length > maxlimit) {
        // if too long...trim it!
        field.value = field.value.substring(0, maxlimit);
    } else {
        cntfield.value = smsTotalCount - field.value.length;
        smsCntfield.value = smsCount;
    }

}

пример использования:

<html:textarea cols="30" rows="5" property="textEn"
                                                    title="Text English"
                                                    onkeydown="textCounter(document.form.textEn,document.form.remLen2,document.form.smsCount2,0,762)"
                                                    onkeyup="textCounter(document.form.textEn,document.form.remLen2,document.form.smsCount2,0,762)" />
                                                                                                <br>
                                                <input type="text" readonly="readonly" name="remLen2"
                                                    size="3" maxlength="3" value="160"
                                                    title="Char Count">

                                                (
                                                <input type="text" readonly="readonly" name="smsCount2"
                                                    size="1" maxlength="1" value="1"
                                                    title="SMS Parts' />">
                                                )
1 голос
/ 19 июля 2012

Исходя из проблем здесь, я пытаюсь написать лучшее решение. Принято из нескольких лучших ответов здесь.

Javascript

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script>
$(document).ready(function(){

    part1Count = 160;
    part2Count = 145;
    part3Count = 152;

    $('#message').keyup(function(){
        var chars = $(this).val().length;
            messages = 0;
            remaining = 0;
            total = 0;
        if (chars <= part1Count) {
            messages = 1;
            remaining = part1Count - chars;
        } else if (chars <= (part1Count + part2Count)) { 
            messages = 2;
            remaining = part1Count + part2Count - chars;
        } else if (chars > (part1Count + part2Count)) { 
            moreM = Math.ceil((chars - part1Count - part2Count) / part3Count) ;
            remaining = part1Count + part2Count + (moreM * part3Count) - chars;
            messages = 2 + moreM;
        }
        $('#remaining').text(remaining);
        $('#messages').text(messages);
        $('#total').text(chars);
        if (remaining > 1) $('.cplural').show();
            else $('.cplural').hide();
        if (messages > 1) $('.mplural').show();
            else $('.mplural').hide();
        if (chars > 1) $('.tplural').show();
            else $('.tplural').hide();
    });
    $('#message').keyup();
});
</script>

HTML

<textarea name="message" value="" id="message"></textarea>
<div>
    <div><span id="remaining">160</span>&nbsp;Character<span class="cplural">s</span> Remaining</div>
    <div>Total&nbsp;<span id="messages">1</span>&nbsp;Message<span class="mplural">s</span>&nbsp;<span id="total">0</span>&nbsp;Character<span class="tplural">s</span></div>
</div>

Вы можете получить код здесь http://www.mindrestingplace.com/2012/07/18/sms-character-counter/

Надеюсь, это решит ваши проблемы. Спасибо

0 голосов
/ 10 июня 2019
  $(function() {        
          $('#message').keydown(function() {
                  var mychars = $('#message').val().length; 
                  var mysms = Math.ceil(mychars / 160);

                           console.log (mysms); 
                           console.log (mychars +'' + ' characters'); 
           });
      });
0 голосов
/ 08 августа 2017

Для отправки SMS количество символов

Логика / требование:
  1. если len <= 160, чем send (1 SMS) </li>
  2. , если len> 160 и после каждых 153 символов / len,чем отправить (1 ++)
Вариант использования: len от 1 до 160 = отправка SMS 1 len от 161 до 313 = отправка SMS 2 len от 314 до 466 = отправка SMS 3

И такна ...

Сценарий:

function cntsms(len) { 
   return len <= 0 ? 0 : ( len > 160 ? Math.ceil((len-7)/153) : 1);
}
0 голосов
/ 09 декабря 2012

Это поздно в игре, но вот что я сейчас собираю.

Ограничение на число символов установлено на 459, чтобы разрешить объединенные сообщения (как установлено моим поставщиком услуг), с общим количеством текстовых единиц на 160 используемых символов.Имейте в виду, что этот аспект является неполным, поскольку каждый блок после начального будет содержать менее 160 символов шаблона из-за заголовков сообщений и еще много чего.Я просто еще не получил точную разбивку от провайдера.

Принципиальное отличие этого скрипта в том, что количество символов чувствительно к нестандартным символам GSM, их значения ascii указаны во включенном массиве.Если набирается нестандартный символ, счет равен 2, иначе 1.

$('#sms-message').keyup(function(){
var     chars = $(this).val(),
        arr_chars = chars.split(''),
        remaining = $('#remaining'),
        messages = $('#messages'),
        count = 0;

    $.each(arr_chars, function(i, l){
        var     ascii = l.charCodeAt(0),
                ascii_val = parseInt(ascii),
                //array of special chars
                arr = [13, 47, 92, 123, 124, 125, 126, 128];

        if($.inArray(ascii_val, arr) !== -1) { count = count + 2; }
        else { count = count + 1; }
    });

            //inaccurate count, will have to be finetuned to provider specs
    var     units = Math.ceil(count / 160),
            remaining_chars = 459 - count;

        remaining.text(remaining_chars + ' characters remaining');
        messages.text(units + ' text unit(s)');

        if(remaining_chars < 0) {
            $(remaining).css('color', 'red');
        }
        else {
            $(remaining).css('color', 'black');
        }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...