Оригинал: http://rattler.kiev.ua/node/16
Автор: Михаил Бочкарев, Net Style
Как можно было догадаться из заголовка, с кодировками в SMS дело обстоит не так просто, как может показаться на первый взгляд. Некоторые моменты я уже описывал, но в этот раз попробую подойти более системно, заодно упомянув имеющиеся инструменты.
Итак, самый распространенный вариант - SMS в 7-битном алфавите GSM 03.38. За счет того, что на символ приходится всего 7 бит, в доступные нам 140 байт можно поместить 160 символов. Не правда ли, очень похоже на ASCII ;-)
Более того, латинские буквы, цифры, пробел и часть спецсимволов находятся на тех же самых позициях, что прекрасно сбивает с толку начинающих разработчиков SMS-платформ, потому что именно в это момент можно обнаружить следующие отличия:
-
Некоторые символы находятся не на привычном месте. Самый яркий пример - символ @ с кодом 0x00.
-
Нет некоторых спецсимволов вроде [, ], {, }, ~, |, но зато присутствуют символы греческого алфавита.

Таблицу символов можно посмотреть, например, здесь:
http://en.wikipedia.org/wiki/Short_message_service#GSM
А как же тильды с обратными слешами? Все очень просто - для этого используются Escape-последовательности и каждый такой символ на самом деле состоит из двух. Например, символ { выглядит как <ESC>(.
Не верите? Возьмите телефон и посмотрите, на сколько уменьшится счетчик оставшихся символов после ввода тильды :-)
Ну и напоследок о великом счастье для разработчиков на Perl. У них есть наистандартнейший модуль Encode, который знает о существовании спецификации ETSI GSM 03.38 и позволяет работать с такими данными:
Пример кода:
use Encode qw/encode decode/;
$gsm0338 = encode("gsm0338", $utf8);
$utf8 = decode("gsm0338", $gsm0338);
Не правда ли, все очень просто? ;-)