2011-03-28 62 views
4

我发现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

大部分似乎算得很好。 '您好,请问你吃饭了吗?'* *长11个字符,日语,韩语和俄语的数字也很好。你会期待什么数字?只有泰语和印地语可能会关闭,但我不知道字符如何计算在那里。 – deceze 2011-03-28 05:21:22

+0

是的,正如你所说的泰语和印地语不同,好的已经是2个字符,所以,如上所述,我发现如何使它支持国际中文,泰文,日文,韩文,印地文,俄文。 – Ironman 2011-03-28 05:32:39

+2

是的,但“您“是*一个UTF-8字符*。显然你要计算*字节*,而不是字符? – deceze 2011-03-28 06:06:54

回答

9

你不能真正指望这里的“字符”。根据Wikipedia上的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/

+0

如何使用'Math.ceil(Math.log(message.charCodeAt(i))/ Math。log(2 << bits))'with'bits'是“7”还是“8”而不是? – Gumbo 2011-03-28 09:14:51

+1

@Gumbo:我不认为这适用于此。 GSM 7和8位编码不基于Unicode代码点('charCodeAt'返回)。 – RoToRa 2011-03-28 09:43:16

+0

我认为* [SMS标准](http://www.3gpp.org/ftp/Specs/html-info/23038.htm)指定了UCS-2而不是UTF-16。所以只有2个字节的字符,并且没有BMP以外的字符。 – 2011-08-15 04:26:35