使用jQuery计算字符/短信

我使用NobleCount计算字符和以下代码:

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

我想要一个像计数短信的function,如果达到限制,接下来的160个字符用于第二个短信,依此类推。 我可以使用on_update,on_positive,on_negative和block_negative等参数。

我尝试使用modulo,但它不起作用。 有任何想法吗?

首先,字符计数非常容易。 您只需要在字符串上使用length属性。 要计算所需的SMS消息数量,您需要除以160并向上舍入(因为161个字符需要2条消息)。 您的代码应该看起来像这样:

HTML:

  

160 characters remaining 1 message(s)

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示例。

请注意,SMS比您指示的更复杂。

标准的“160字符”SMS使用奇怪的7位编码 ,涵盖大多数ASCII,一些欧洲口音,misc符号,如€,一些大写希腊字母(看起来不像罗马字符的那些)。

如果您的消息使用其他字符,则可以使用UCS-2(如UTF-16但仅限BMP)将其编码为Unicode,限制为70个字符。 实际上,规范 UCS-2,但表情符号(非BMP Unicode)可以用SMS发送,这意味着正在使用UTF-16,在这种情况下,每个表情符号必须“消耗”70个总共中的2个字符。

但是有些语言可以使用“国家语言转换表” ,它使用另一种 7位编码。 最着名的是土耳其语,还有西class牙语,葡萄牙语和十种印度次大陆语言。 这些是标准的新增function。

即使在7位编码中,一些字符也被“转义”,这意味着它们“耗尽”了2个字符。 在默认的7位编码中,这些是: {}[]\|^~€

如果您的消息超过160个字符,它可以使用“连接短信”,但随后会在每个消息中添加一个小标题,这意味着每个段只有153个字符的空间。 该标题有两种不同版本,大小不同,因此可能不是153个字符,而是152个(来自内存)。 类似地,对于Unicode连接的SMS,小标头使每个段有67个字符。

祝你好运!

这是一个小插件给你。 这是我的第一个jQuery插件,我免费提供;)你只需要启动它:

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

HTML:

   SMS () Characters left  

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

演示: http : //jsfiddle.net/t32h0gj4/1/

注意:有一些基本选项

 $('#smsText').smsArea({cut:false}); //Do not cut the SMS $('#smsText').smsArea({maxSmsNum:2}); //2 SMS Max 

一旦消息被解码为Craig McQueen在这个post中说明并且你有实际的字符数,那么计算所需的SMS数量就足够了:

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

……我非常喜欢单行解决方案。

我认为以下脚本可以生成更准确的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; } } 

示例使用:

  
( )

扩展表(GSM扩展字母表)中的每个字符由两个字符表示,实际最大长度动态计算为:160-k,其中k是消息中使用的扩展字符数。

在使用8位参考号连接消息时,还必须考虑消息长度为153个字符。

Unicode长度为70个字符,连接63个字符。

基于这里的问题,我试着写出更好的解决方案。 这里有几个最好的答案。

使用Javascript

   

HTML

  
160 Characters Remaining
Total 1 Messages 0 Characters

你可以在这里获得代码http://www.mindrestingplace.com/2012/07/18/sms-character-counter/

希望这能解决你的问题。 谢谢

我更新了脚本(为了我的目的),也将主题包含在计数中。 这就是我提出的:

 $(document).ready(function(){ var $remaining = $('#remaining'), $messages = $remaining.next(); $('#message').keyup(function(){ var chars = this.value.length + document.getElementById('subject').value.length, messages = Math.ceil(chars / 160), remaining = messages * 160 - (chars % (messages * 160) || messages * 160); $remaining.text(remaining); //$remaining.text(remaining + ' characters remaining'); //$messages.text(messages + ' message(s)'); }); $('#subject').keyup(function(){ var chars = this.value.length + document.getElementById('message').value.length, messages = Math.ceil(chars / 160), remaining = messages * 160 - (chars % (messages * 160) || messages * 160); $remaining.text(remaining); //$remaining.text(remaining + ' characters remaining'); //$messages.text(messages + ' message(s)'); }); 

});

我测试过它的确有效。 我也改了一下html:

 

160 characters remaining

这是游戏的后期,但这是我目前正在组合的内容。

字符限制设置为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'); } }); 

用于SMS发送字符数

逻辑/要求:

  1. 如果len <= 160而不是发送(1条短信)
  2. 如果len> 160且每153个字符/ len之后,则发送(1 ++)

使用案例:

  1. len 1到160 =短信发送1
  2. len 161 to 313 =短信发送2
  3. len 314到466 =短信发送3

等等…

脚本:

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