1

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

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

ソリューションには下位互換性がなく、製品のサポートが困難になる可能性があるため、オプション 1 は使用したくありません。

オプション 2 を使用したいのですが、どのようにすればよいかわかりません。特に、使用できるさまざまなエスケープ文字 (_それらの 1 つ) と、エスケープコードを検出する方法がわかりません。

この問題は主にクロス カントリー SMS で見られます。

どんな助けでも大歓迎です。

4

1 に答える 1

3

いくつかのオプションがあります。

  1. Android の SMS デコード システムを使用します (比較的優れており、完全ではありませんが十分です)。

  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 は 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 でよく使用される文字がいくつかあります。

以下は、デフォルト/拡張文字セットの処理方法を指定する 3GPP からの情報のルート ソースです。各表の下の注意事項に特に注意してください!!

于 2011-12-23T08:17:42.067 に答える