国际计数短信人物

我使用jQuery找到了Count字符/短信 ,但它不支持国际字符,如中文,日文,泰文等。

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字符进行此操作?

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

如果您知道您将始终使用UTF-16,那么您可以计算字符串将占用的16位代码单元的数量。 标准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; } 

顺便说一下,这出现你发布的“不正确”的相同数字,所以你需要解释为什么你认为它们不正确。


编辑

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