1

任意の文字列を GSM アルファベットの文字のみを含む文字列に変換するアルゴリズム (できれば Python) が必要です。SMS:es で文字列をテキストとして送信するには、このフィルターが必要です。可能であれば、アルゴリズムは文字を最も近いエンコード可能な文字に置き換える必要もあります。例:

>>> gsm_convert('© all rights reserved')
[copyright sign] all rights reserved
# or
C all rights reserved
>>> gsm_convert('––– long dashes –––')
--- long dashes ---

Python にはこれを行うための組み込みアルゴリズムがいくつかありますが、これらの関数は入力文字列を正しくない ascii に変換します。GSM は、ASCII にないいくつかの文字を処理します。

4

4 に答える 4

4

Perl と PHP でこれを行うことから、正規表現を使用して 2 つのステップで行います。

  • 正規表現のサポートを含めることから始めます

    import re
    
  • 可能な限り最も近い文字に置き換えます。

    たとえば、次のように「á」を「a」に置き換えるなど、一連の正規表現を使用することをお勧めします。

    message = ur'abc\u00e9\u00e1'
    message = re.sub(ur'\u00e1','a',message)
    
  • GSM 文字セットにない残りの文字をすべて削除します。

    message = ur'abc\u00e9\u00e1'    
    
    message = re.sub(ur'[^\u0040\u00A3\u0024\u00A5\u00E8\u00E9\u00F9\u00EC\u00F2\u00C7\u000A\u00D8\u00F8\u000D\u00C5\u00E5\u0394\u005F\u03A6\u0393\u039B\u03A9\u03A0\u03A8\u03A3\u0398\u039E\u00C6\u00E6\u00DF\u00C9\u0020\u0021\u0022\u0023\u00A4\u0025\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F\u00A1\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u00C4\u00D6\u00D1\u00DC\u00A7\u00BF\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u00E4\u00F6\u00F1\u00FC\u00E0\u20AC\u005B\u005C\u005D\u005E\u007B\u007C\u007D\u007E]','',message)
    
    print message
    

この例では、GSM 文字セットの一部ではない( ) をabcé削除して出力します。á\u00e1

于 2011-02-28T14:22:49.790 に答える
1

コーデックが必要なようです。グーグルはこれを見つけました:http://demo.sahanafoundation.org/gsoc2010/amishra/gsoc/modules/pygsm/gsmcodecs/ それが機能するかどうかはわかりません。自分で調べる必要があります。

そのコードのライセンスはhttp://demo.sahanafoundation.org/gsoc2010/amishra/gsoc/modules/pygsm/LICENSEにあります。

編集: こんにちは、pygsm への貢献者です (疑問がある場合は、docstring テストの番号に電話してください)。

参考までに、上記の Sahana コードはhttp://eden.sahanafoundation.org/browser#modules/pygsm/に移動したようです。

また、この Sahana コードはhttps://github.com/developmentsseed/slingshotSMSから派生したもので、元のスタンドアロン ライブラリhttps://github.com/adammck/pygsm/から派生したもので、ライセンスはhttpsにあります。 ://raw.github.com/adammck/pygsm/master/LICENSE

于 2011-02-28T13:23:22.650 に答える
0

最初の応答のリンクはうまくいくように見えます。FWIW、この投稿からリンクされているライブラリを、同様のことを行うための基礎として使用しました。

ご覧のとおり、作成者はギリシャ語のエンコードに適したコーデックを作成しているため、これは出発点にすぎません。

「任意の」文字列を「最も近い」文字列に変換したいとします。「最も近い」はドメインによって異なる意味を持つ可能性があるため、完全に恣意的にするのは難しいかもしれません(たとえば、Unicodeの雪だるまをどうしますか)?

ラテン語またはラテン語由来のアルファベットを処理しようとしているだけの場合は、「任意」で実行できるはずです。

于 2011-03-03T16:17:32.233 に答える
0

ここに私のC#コードがあります(フランス語のテキスト用)

    public static bool IsGsmString(string message)
    {
        // https://messente.com/documentation/tools/sms-length-calculator
        // https://stackoverflow.com/questions/29541753/regex-only-checks-first-character-in-string-c-sharp/29541980#29541977

        //var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,./\w:;<=>? ¡ÄÖÑܧ¿äöñüà^{}\[~\]|€-]*$");
        //return !strMap.IsMatch(message.Replace(Environment.NewLine, ""));   // Enlever les saut de ligne car non inclus dans le Map

        foreach (char c in message.ToCharArray())
            if (!IsGsmChar(c))
                return false;

        return true;
    }

    public static bool IsGsmChar(char c)
    {
        string strGSMTable = "@£$¥èéùìòÇ`Øø`ÅåΔ_ΦΓΛΩΠΨΣΘΞ`ÆæßÉ !\"#¤%&'()*=,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑÜ`¿abcdefghijklmnopqrstuvwxyzäöñüà";
        strGSMTable += "^{}\\[~]|€" + Environment.NewLine;   // Adding extended char and CRLF

        return strGSMTable.IndexOf(c) >= 0;
    }

    public static string ReplaceNoneGsmChar(string message)
    {
        var converted = "";

        foreach (char c in message.ToCharArray())
        {
            if (IsGsmChar(c))
                converted += c;
            else
                converted += GsmReplacement(c);
        }

        return converted;
    }

    private static string GsmReplacement(char c)
    {
        switch (c)
        {
            case 'â':
                return "a";
            case 'ê':
            case 'ë':
                return "e";
            case 'î':
            case 'ï':
                return "i";
            case 'ô':
                return "o";
            case 'û':
                return "u";
            case 'ÿ':
                return "y";

            case 'Â':
            case 'À':
                return "A";
            case 'È':
            case 'Ê':
            case 'Ë':
                return "E";
            case 'Î':
            case 'Ï':
            case 'Ì':
                return "I";
            case 'Ô':
                return "I";
            case 'Ù':
            case 'Û':
                return "U";

            case '’':
            case '`':
                return "'";

            case '«':
            case '»':
                return @"""";

            case 'µ':
                return "u";
            case '©':
                return "C";
            case 'œ':
                return "oe";

            default:
                return "_";   // non remplacable
        }
    }
于 2018-08-22T19:37:57.520 に答える