我找到了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字符进行此操作?
答案 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/