国际计数短信人物

时间:2011-03-28 05:07:09

标签: javascript jquery unicode internationalization sms

我找到了Count characters/sms using jQuery,但它不支持国际字符,如中文,日文,泰文等。

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

以下是错误字符数的一些示例:

  

您好,请问你吃饭了吗?<< 11个字符

     

สวัสดีคุณกินหรือ? << 17个字符

     

こんにちは,あなたは食べていますか?<< 18个字符

     

안녕하세요,당신이먹는거죠? << 17个字符

     

हैलो,आपखातेहैं? << 18个字符

     

Добрыдзень,выясьце? << 22个字符

如何使用非ASCII字符进行此操作?

1 个答案:

答案 0 :(得分:9)

你不能在这里真正算上“人物”。根据维基百科上的SMS文章,三种不同编码中的一种用于SMS(7位GSM,8位GSM和UTF-16)。首先,您需要知道/决定您将使用哪种编码。

如果您知道自己将始终使用UTF-16,那么您可以计算字符串占用的16-bit code units个数。标准SMS可由70个16位代码单元组成。但这也会将拉丁字符中的消息限制为70。因此,如果您想为拉丁字符使用完整的160个字符(使用7位编码)或140个字符(使用8位编码),那么您需要区分这三种情况。

计算UTF-16 16位代码单元的示例:

var message = "您好,請問你吃飯了嗎?";

var utf16codeUnits = 0;

for (var i = 0, len = message.length; i < len; i++) {
  utf16codeUnits += message.charCodeAt(i) < 0x10000 ? 1 : 2;
}
顺便说一下,这个 会出现你发布的“不正确”的相同数字,所以你需要解释为什么你认为它们不正确。


修改

尽管已被接受,但我很快就破解了一个功能,正确地(据我所知)计算了GSM消息的7位(如果可能)和UTF-16大小:http://jsfiddle.net/puKJb/