2011-12-22 7 views
1

私はさまざまな国のクライアントアプリケーションからSMSを受信するアンドロイドSMSゲートウェイプロジェクトに取り組んでいます。クライアントアプリケーションでは、私は{, }, []を使用して、SMSとしてゲートウェイに送信されるメッセージの一部の開始と終了を識別します。 thisリンクに示されているように、これらの文字はエスケープされる特殊文字です。ゲートウェイによって受信されたSMSはエスケープされた文字をデコードできず、それぞれ_(, _), _<_>と表示されることがあります。これは以下の方法で処理できます。GSMのエスケープコード03.38エンコーディングスキーム

  1. これを処理する1つの方法は、クライアントアプリケーションのエンコードメカニズムを変更し、デフォルトの文字セットのみを使用することです。
  2. 他の方法は、ゲートウェイのエスケープ文字を処理することです。

解決策が下位互換性がなく、製品をサポートすることが困難になる可能性があるため、オプション1を使用したくありません。

オプション2を使用したいと思いますが、どのように正確に行うことができません。特に、使用できるエスケープ文字が何であるか(_はその1つ)、どのようにエスケープコードを検出できるかはわかりません。

この問題は、ほとんどの国で発生しています。

ご協力いただきまして誠にありがとうございます。

答えて

3

あなたはオプションのカップルを持っている:

  1. 次の操作を行うことができますGSM規格に従い

  2. (それは完璧なものの十分ではない、比較的良好である)AndroidのSMSの復号化システムを使用しますデコード:

    各キャラクタをデコードしている間に、キャラクタが「デフォルトキャラクタセット」の一部であるかどうか、または「拡張キャラクタセット」へのエスケープであるかどうかを確認する必要があります。エスケープ文字は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がある

    のint []さん

    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, 
    }; 
    

    私がいることを追加される場合があります。たとえば

あなたのデコードの問題はネイシーではありません単にクロスカントリーの問題に過ぎない。拡張された文字セットには、国のSMSで頻繁に使用されるいくつかの文字が存在するため、

Hereは、デフォルト/拡張文字セットの処理方法を指定する3GPPからの情報の根源です。それぞれの表の下の注に特別な注意を払う!!

+0

GSMUtilsとは何ですか?そのクラスはアンドロイドAPIで利用できますか? – 500865

+0

申し訳ありません、自分のコードからコピーしました。これは、デフォルトおよび拡張GSMアルファベットを定義するint配列です。私はそれを私の答えに加えます。 – aldridmc

関連する問題