Search code examples
pythonencodingsms

Python library for converting plain text (ASCII) into GSM 7-bit character set?


Is there a python library for encoding ascii data to 7-bit GSM character set (for sending SMS)?


Solution

  • There is now :)

    Thanks to Chad for pointing out that this wasn't quite right

    Python2 version

    # -*- coding: utf8 -*- 
    gsm = (u"@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>"
           u"?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà")
    ext = (u"````````````````````^```````````````````{}`````\\````````````[~]`"
           u"|````````````````````````````````````€``````````````````````````")
    
    def gsm_encode(plaintext):
        res = ""
        for c in plaintext:
            idx = gsm.find(c)
            if idx != -1:
                res += chr(idx)
                continue
            idx = ext.find(c)
            if idx != -1:
                res += chr(27) + chr(idx)
        return res.encode('hex')
    
    print gsm_encode(u"Hello World")
    

    The output is hex. Obviously you can skip that if you want the binary stream

    Python3 version

    # -*- coding: utf8 -*- 
    import binascii
    gsm = ("@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1bÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?"
           "¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà")
    ext = ("````````````````````^```````````````````{}`````\\````````````[~]`"
           "|````````````````````````````````````€``````````````````````````")
    
    def gsm_encode(plaintext):
        res = ""
        for c in plaintext:
            idx = gsm.find(c);
            if idx != -1:
                res += chr(idx)
                continue
            idx = ext.find(c)
            if idx != -1:
                res += chr(27) + chr(idx)
        return binascii.b2a_hex(res.encode('utf-8'))
    
    print(gsm_encode("Hello World"))