Когда долго работаешь с чем-то, то многие моменты становятся очевидными.
Однако сегодня задали вопрос, на который, казалось бы, свободно ответит и первоклассник ;-)
Пусть его поезд уже отправляется в последний путь, но он ещё многих переживет - его величество SMS.
Магические SMS константы... полное разоблачение!
Всего в SMS лезет 140 8-bit байт (байты бывают разной битности, 8-bit стал стандартом де-факто).
Латиница (буквы европейский алфавитов - A-Za-z, умляуты всякие и греческие Ф и П, цифры и всякие знаки +?!.) кодируется 7bit байтами: 140*8/7 = 160 символов в латинице.
Русские (украинские, японский и другие не европейские языки) кодируются в Unicode/UCS2 двумя 8-bit байтами = 16-bit на Unicode символ: 140/2 = 70 символов в Unicode.
ВАЖНО! Если в чистую и светлую европейскую SMS затесался хоть один "русский мужик" e.g. Hello - где о русская или "прОклятый подарок" от MS Word e.g. типографские ёлочки вместо ", то вся SMS моментально превращается в unicode и латинские буквы также кодируются 16-bit.
Если в SMS на русском затесался латинский символ - не переживайте, его хорошо примут.
К огромному сожалению UTF-8 изобрели поздновато для SMS ;-(
Расчеты выше верны, если текст ЛЕЗЕТ В ОДНУ SMS!
Если мы вылезли за магические 160/70 символов, то SMS превращается в длинную/склеенную.
У нас по прежнему 140 байт, но туда надо ещё впихнуть 6 байт информации для склейки.
* (140-6)*8/7 = 153 латинских символов в случае нескольких SMS на одну SMS, а уже никак не 160!
* (140-6)/2 = 67 Unicode символа.
Итак теперь "всем и так очевидно" как говорили у нас в корпорации, откуда взялись и почему:
Латиница 160/153. Unicode (русский и другие не европейские языки - умпяуты есть в латинице) 70/67.
UPD!
Кодировка GSM != US-ASCII.
В GSM 8-bit байты используются только для данных, но не для текста.
Для текста всего два варианта 7-bit (GSM default alphabet) и 16-bit (Unicode - UCS2 ~ UTF-16BE).
Авторы GSM default alphabet - GSM 03.38 проделали отличную работу и впихнули в 7-bit всё что нужно большинству европейцев. В US-ASCII многих символов из GSM кодировки попросту нет.
Кроме того, позже в GSM добавили escape последовательности с помощью которых кодировка стала содержать более чем 128 символов.
Вот одно из описаний кодировки GSM 03.38 в сети: http://www.dreamfabric.com/sms/default_alphabet.html
Однако сегодня задали вопрос, на который, казалось бы, свободно ответит и первоклассник ;-)
Пусть его поезд уже отправляется в последний путь, но он ещё многих переживет - его величество SMS.
Магические SMS константы... полное разоблачение!
Всего в SMS лезет 140 8-bit байт (байты бывают разной битности, 8-bit стал стандартом де-факто).
Латиница (буквы европейский алфавитов - A-Za-z, умляуты всякие и греческие Ф и П, цифры и всякие знаки +?!.) кодируется 7bit байтами: 140*8/7 = 160 символов в латинице.
Русские (украинские, японский и другие не европейские языки) кодируются в Unicode/UCS2 двумя 8-bit байтами = 16-bit на Unicode символ: 140/2 = 70 символов в Unicode.
ВАЖНО! Если в чистую и светлую европейскую SMS затесался хоть один "русский мужик" e.g. Hello - где о русская или "прОклятый подарок" от MS Word e.g. типографские ёлочки вместо ", то вся SMS моментально превращается в unicode и латинские буквы также кодируются 16-bit.
Если в SMS на русском затесался латинский символ - не переживайте, его хорошо примут.
К огромному сожалению UTF-8 изобрели поздновато для SMS ;-(
Расчеты выше верны, если текст ЛЕЗЕТ В ОДНУ SMS!
Если мы вылезли за магические 160/70 символов, то SMS превращается в длинную/склеенную.
У нас по прежнему 140 байт, но туда надо ещё впихнуть 6 байт информации для склейки.
* (140-6)*8/7 = 153 латинских символов в случае нескольких SMS на одну SMS, а уже никак не 160!
* (140-6)/2 = 67 Unicode символа.
Итак теперь "всем и так очевидно" как говорили у нас в корпорации, откуда взялись и почему:
Латиница 160/153. Unicode (русский и другие не европейские языки - умпяуты есть в латинице) 70/67.
UPD!
Кодировка GSM != US-ASCII.
В GSM 8-bit байты используются только для данных, но не для текста.
Для текста всего два варианта 7-bit (GSM default alphabet) и 16-bit (Unicode - UCS2 ~ UTF-16BE).
Авторы GSM default alphabet - GSM 03.38 проделали отличную работу и впихнули в 7-bit всё что нужно большинству европейцев. В US-ASCII многих символов из GSM кодировки попросту нет.
Кроме того, позже в GSM добавили escape последовательности с помощью которых кодировка стала содержать более чем 128 символов.
Вот одно из описаний кодировки GSM 03.38 в сети: http://www.dreamfabric.com/sms/default_
4 comments | Leave a comment