Кодировка £ в SMS-сообщении, отправленном через шлюз, работает неправильно - PullRequest
1 голос
/ 27 марта 2009

У меня проблемы с отправкой SMS-сообщения через провайдера Cymba.

По сути, я отправляю им сообщение в соответствии с их спецификацией URL в кодировке.

Однако, когда сообщение отправляется на мой телефон, появляется знак £ с буквой A, т. Е. £ A

Теперь строки C # по умолчанию являются Unicode, поэтому я перешел на кодировку ASCII, и символ £ появляется как?.

Я попытался преобразовать строку сообщения в шестнадцатеричный формат, начиная с версий Unicode и ASCII (так как через этот шлюз вы также можете отправить сообщение в шестнадцатеричном виде). Однако происходит то же самое поведение.

Я подозреваю, что это связано с кодировкой строки, так как SMS поддерживает 7-битный формат кодирования: GSM 03.38

.

Я также подозреваю, что если я отправлю через Unicode, я получу только 70 или 140 символов вместо стандартного 160.

Я довольно новичок в отправке SMS, поэтому любая помощь или совет будут оценены.

Итак, вопрос в том, как мне получить строки C # в этом формате?

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

byte pound = 0xA3;
byte GSMPound = 0x01;
string hexxedMsg = "";
System.Text.UnicodeEncoding encoder = new System.Text.UnicodeEncoding();
byte[] msgBytes = encoder.GetBytes(message);

foreach (byte byt in msgBytes)
{
    if(byt == pound)
        hexxedMsg += GSMPound.ToString("X");
    else
        hexxedMsg += byt.ToString("X2"); ;
}

Ответы [ 3 ]

2 голосов
/ 27 марта 2009

Доступна таблица сопоставления GSM 03.38 для Unicode , в которой предлагается, чтобы символ £ был закодирован как 0x01, чтобы вы могли попробовать это (просто жестко кодировать его для одной попытки). Тем не менее, вы должны действительно проверить все это с оператором шлюза. Действительно ли шлюз ожидает от вас публикации в кодировке URL-адреса GSM 03.38? Если это так, то эта таблица сопоставления, вероятно, является подходящим способом - вам может потребоваться написать собственную реализацию для отображения из строки в байты (полная реализация System.Text.Encoding была бы излишней). Сначала я бы попробовал это с жестко закодированным сообщением.

1 голос
/ 16 января 2013

Вы должны взглянуть на это: https://github.com/mediaburst/.NET-GSM-Encoding/blob/master/GSMEncoding.cs

1 голос
/ 27 марта 2009

Эта страница содержит информацию о "7-битном алфавите по умолчанию" .

Самым простым решением может быть создание словаря, который отображает кодовые точки Unicode, закодированные стандартом GSM 03.38 (приблизительно 140 символов), в 1 или 2 байта (2 пары необходимы для пар 0x27, 0x ??). 1007 *

Как только это будет сделано (в зависимости от вашего провайдера), вам также может понадобиться сжать 8-битные байты в поток 7-битных последовательностей. Здесь есть визуальный образец .

И после того, как вы достигли всего этого (и выпили пару бутылок пива!), Вы можете захотеть превратить его в реализацию System.Text.Encoding.


Возможно, вы захотите взглянуть на PDUDecoder на CodeProject для обратной операции. Также есть онлайн-версия.

...