Вы не можете действительно рассчитывать на "символы" здесь.Согласно статье 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/