международный граф смс персонажей - PullRequest
4 голосов
/ 28 марта 2011

Я нашел Подсчет символов / смс с использованием 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 , 請問 你 吃飯 了 嗎? << 11 символов </p>

สวัสดี คุณ กิน หรือ? << 17 символов </p>

? 18? 18??????? 18 18 << 18 символов </p>

안녕하세요, 당신 이 먹는 거죠? << 17 символов </p>

हैलो, आप खाते हैं? << 18 символов </p>

Добры дзень, вы ясьце? << 22 символа </p>

Как я могу заставить это работать с не-ASCII символами?

1 Ответ

9 голосов
/ 28 марта 2011

Вы не можете действительно рассчитывать на "символы" здесь.Согласно статье SMS в Википедии, для SMS используется одно из трех различных кодировок (7-битный GSM, 8-битный GSM и UTF-16).Итак, сначала вам нужно знать / решить, какую кодировку вы будете использовать.

Если вы знаете, что вы всегда будете использовать UTF-16, тогда вы можете посчитать количество 16-битных кодовых единиц , которое займет строка.Стандартное SMS может состоять из 70 16-битных кодовых единиц.Но это также ограничит количество сообщений латинскими буквами до 70.Поэтому, если вы хотите использовать полные 160 символов (с 7-битной кодировкой) или 140 символов (с 8-битной кодировкой) для латинских символов, вам нужно будет различать эти три случая.

Примердля подсчета 16-битных кодовых единиц UTF-16:

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

var utf16codeUnits = 0;

for (var i = 0, len = message.length; i < len; i++) {
  utf16codeUnits += message.charCodeAt(i) < 0x10000 ? 1 : 2;
}

Кстати, эти будут приводить те же цифры, которые вы указали как "неправильные", поэтому вам нужно объяснитьпочему вы считаете их неправильными.


РЕДАКТИРОВАТЬ

Несмотря на то, что меня уже приняли, я быстро взломал функцию, которая правильно (насколько я могу сказать) вычисляетРазмер SMS-сообщения в формате GSM 7 бит (если возможно) и UTF-16: http://jsfiddle.net/puKJb/

...