Escape-коды в схеме кодирования GSM 03.38 - PullRequest
1 голос
/ 22 декабря 2011

Я работаю над проектом шлюза для Android, который получает смс из клиентского приложения из разных стран.В клиентском приложении я использую {, }, [ и ] для определения начала и конца некоторой части сообщения, которое отправляется в виде SMS на шлюз.Как указано в этой ссылке, эти символы являются специальными символами, которые экранируются.Иногда SMS, полученные шлюзом, не могут декодировать экранированные символы, и они будут отображаться как _(, _), _< и _> соответственно.Это можно обработать следующими способами.

  1. Один из способов справиться с этим - изменить механизм кодирования в клиентском приложении и использовать только набор символов по умолчанию.
  2. Другой способ -иметь дело с escape-символом в шлюзе.

Я не хочу использовать вариант 1, поскольку решение не будет обратно совместимым, и поддержка продукта может стать затруднительной.

Я хотел бы выбрать вариант 2, но я не уверен, как именно я могу это сделать.В частности, я не уверен, какие различные escape-символы можно использовать (_ является одним из них) и как можно обнаружить escape-код.

Эта проблема встречается в основном в кросс-кантриsms'es.

Любая помощь высоко ценится.

1 Ответ

3 голосов
/ 23 декабря 2011

У вас есть несколько вариантов:

  1. Используйте систему декодирования SMS Android (она относительно хорошая, не идеальная, но достаточно хорошая)

  2. Следуя спецификациям GSM, вы можете выполнить следующее декодирование:

    Во время расшифровки каждого символа вы должны проверить, является ли этот символ частью «набора символов по умолчанию» или это переход к «расширенному набору символов». Экранирующий символ - 0x1B . Это говорит вашему декодеру, что следующий символ должен быть из "расширенного набора символов". Если ваш декодер не находит этот символ в «расширенном наборе символов», то по спецификации GSM он должен сначала попытаться найти этот символ в «наборе символов по умолчанию». Если он также отсутствует в «наборе символов по умолчанию», то следует использовать пробел .

Например:

if (escaped) {
  char ext = (char) GSMUtils.BYTE_TO_CHAR_ESCAPED[val];
  // if no character defined then do fall back
  ext = ext != -1 ? ext : (char) GSMUtils.BYTE_TO_CHAR[val];
  // if no character defined then fall back to <space> 
  return ext != -1 ? ext : ' '; 
} else {
  char ch = (char) GSMUtils.BYTE_TO_CHAR[val];
  // if no character defined then fall back to <space>
  return ch != -1 ? ch : ' '; 
}

Где GSMUtils.BYTE_TO_CHAR_ESCAPED и GSMUtils.BYTE_TO_CHAR являются целыми []

private static final int[] BYTE_TO_CHAR = {
    0x0040, 0x00A3, 0x0024, 0x00A5, 0x00E8, 0x00E9, 0x00F9, 0x00EC,
    0x00F2, 0x00E7, 0x000A, 0x00D8, 0x00F8, 0x000D, 0x00C5, 0x00E5,
    0x0394, 0x005F, 0x03A6, 0x0393, 0x039B, 0x03A9, 0x03A0, 0x03A8,
    0x03A3, 0x0398, 0x039E, 0x00A0, 0x00C6, 0x00E6, 0x00DF, 0x00C9,
    0x0020, 0x0021, 0x0022, 0x0023, 0x00A4, 0x0025, 0x0026, 0x0027,
    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
    0x00A1, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
    0x0058, 0x0059, 0x005A, 0x00C4, 0x00D6, 0x00D1, 0x00DC, 0x00A7,
    0x00BF, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
    0x0078, 0x0079, 0x007A, 0x00E4, 0x00F6, 0x00F1, 0x00FC, 0x00E0,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
        -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
};

и

private static final int[] BYTE_TO_CHAR_ESCAPED = {
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1, 0x000C,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1, 0x005E,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
0x007B, 0x007D,     -1,     -1,     -1,     -1,     -1, 0x005C,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1, 0x005B, 0x007E, 0x005D,     -1,
0x007C,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     0x20AC, -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
    -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
};

Могу добавить, что ваши проблемы с декодированием не обязательно будут просто проблемой между странами. Поскольку в расширенном наборе символов есть ряд символов, которые часто используются в национальных смс-сообщениях.

Здесь - корневой источник информации от 3GPP, определяющий, как обрабатывать наборы символов по умолчанию / расширенные. Обратите особое внимание на примечания под каждой из таблиц !!

...