Javascript 国际短信字符数

Javascript 国际短信字符数,javascript,jquery,unicode,internationalization,sms,Javascript,Jquery,Unicode,Internationalization,Sms,我发现了,但它不支持国际字符,如中文、日文、泰文等 var $remaining = $('#remaining'), $messages = $remaining.next(); $('#message').keyup(function(){ var chars = this.value.length, messages = Math.ceil(chars / 160), remaining = messages * 160 - (chars

我发现了,但它不支持国际字符,如中文、日文、泰文等

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)');
});
以下是一些错误字符计数的示例:

您好,請問你吃飯了嗎? 这里的“角色”不能算在内。根据维基百科上的文章,SMS使用了三种不同的编码之一(7位GSM、8位GSM和UTF-16)。因此,首先您需要知道/决定将使用哪种编码

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

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

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

var utf16codeUnits = 0;

for (var i = 0, len = message.length; i < len; i++) {
  utf16codeUnits += message.charCodeAt(i) < 0x10000 ? 1 : 2;
}
var消息=”您好,請問你吃飯了嗎?";
变量utf16codeUnits=0;
for(变量i=0,len=message.length;i
将写出相同的数字,如“不正确”,所以你需要解释为什么你认为它们不正确。


编辑


尽管我已经被接受,但我很快就创建了一个功能,可以正确地(据我所知)计算GSM 7位(如果可能)和UTF-16大小的短信:

在大多数情况下似乎算得上不错。
您好,請問你吃飯了嗎?
有11个字符长,日语、韩语和俄语的数字也可以。您希望看到什么数字?只有泰语和印地语可能不可用,但我不知道那里的字符是如何计数的。是的,正如您所说,泰语和印地语是不同的,ดี 已经是2个字符了,所以,正如上面我发现的jquery,如何使它支持国际汉语、泰语、日语、韩语、印地语、俄语……是的,但是“您是一个UTF-8字符。显然,您想计算字节数,而不是字符数?使用
Math.ceil(Math.log(message.charCodeAt(i))/Math.log如何(2@Gumbo:我认为这不适用于这里。GSM 7位和8位编码不是基于Unicode码点(返回)。我认为指定的是UCS-2,而不是UTF-16。因此,只有2字节字符,BMP之外没有字符。@RoToRa在jsfiddle代码中,gsm7bitUnits不适用于西班牙语中常见的重音字符,如“á”。@RoToRa只是进一步调查,发现类似“á”的字符“是非GSM的,因此包含它们的SMS消息的最大长度为70,这些字符被计为1个单位。