Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

hosting en interdominios
559 lecturas y 16 respuestas
  • Boca de Pez Boca de Pez
    6

    PHP - SMS

    Hola estoy contruyendo una pagina PHP para enviar SMS, todo me funciona bien pero no consigo dar con la forma de codificar el texto y evitar los caracteres especiales. lo que sucede es que ciertos caracteres , ñ,¨,$,€ etc .. hacen que el mensaje pueda sobrepasar los 160 permitidos ya que se transforman y ocupan mas ..

    ahora lo tengo asi:

    $mensage = urlencode(utf8_encode(substr($_POST["texto"],0,160)));

    he leido por internet que la codificacion correcta para esta tarea es GSM 03.38, pero no se como hacerlo en PHP.

    Agradezco su ayuda de antemano.

    Muchas gracias

    Este tema lleva más de 6 meses inactivo. Es recomendable que abras un nuevo tema para retomar la conversación.
      • Boca de Pez Boca de Pez
        6

        Que es exactamente lo que hace esa funcion?? Y como la…

        Que es exactamente lo que hace esa funcion??

        Y como la integro??

        Tengo una variable con el texto que se excribe y luego la codifico

        $mensage = urlencode(utf8_encode(substr($_POST["texto"],0,160)));

        como deberia hacer con la funcion que me has dicho?

        Gracias.

        • Boca de Pez Boca de Pez
          6

          Con tu función no tienes garantizado que los caracteres sean…

          Con tu función no tienes garantizado que los caracteres sean solamente aquellos que permite la norma GSM 03.38.

          Prueba la función que te he propuesto. Llámala una y otra vez, con diferentes argumentos, y observa la salida. Así no sabrás cómo funciona, pero sí lo que hace. Eso ha de ser suficiente para ti.

    • Boca de Pez Boca de Pez
      6

      He encontrado este codigo, pero sinceramente .. no tengo ni…

      He encontrado este codigo, pero sinceramente .. no tengo ni idea de como integrarlo en mi php, o como llamar a las funciones o como decirle que codifique el texto que se almacena en la variable $text ....

      • Boca de Pez Boca de Pez
        6

        /*** Class capable of encoding GSM 03.38 default alphabet and…

        /**
        * Class capable of encoding GSM 03.38 default alphabet and packing octets into septets as described by GSM 03.38.
        * Based on mapping:www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
        *
        * Copyright (C) 2011 OnlineCity
        * Licensed under the MIT license, which can be read at:www.opensource.org/licenses/mit-license.php
        * @author hd@onlinecity.dk
        */
        class GsmEncoder
        {
        
        /**
        * Encode an UTF-8 string into GSM 03.38
        * Since UTF-8 is largely ASCII compatible, and GSM 03.38 is somewhat compatible, unnecessary conversions are removed.
        * Specials chars such as € can be encoded by using an escape char \x1B in front of a backwards compatible (similar) char.
        * UTF-8 chars which doesn't have a GSM 03.38 equivalent is replaced with a question mark.
        * UTF-8 continuation bytes (\x08-\xBF) are replaced when encountered in their valid places, but
        * any continuation bytes outside of a valid UTF-8 sequence is not processed.
        *
        * @param string $string
        * @return string
        */
        public static function utf8_to_gsm0338($string)
        {
        $dict = array(
        '@' => "\x00", '£' => "\x01", '$' => "\x02", '¥' => "\x03", 'è' => "\x04", 'é' => "\x05", 'ù' => "\x06", 'ì' => "\x07", 'ò' => "\x08", 'Ç' => "\x09", 'Ø' => "\x0B", 'ø' => "\x0C", 'Å' => "\x0E", 'å' => "\x0F",
        '?' => "\x10", '_' => "\x11", 'F' => "\x12", 'G' => "\x13", '?' => "\x14", 'O' => "\x15", '?' => "\x16", '?' => "\x17", 'S' => "\x18", 'T' => "\x19", '?' => "\x1A", 'Æ' => "\x1C", 'æ' => "\x1D", 'ß' => "\x1E", 'É' => "\x1F",
        // all \x2? removed
        // all \x3? removed
        // all \x4? removed
        'Ä' => "\x5B", 'Ö' => "\x5C", 'Ñ' => "\x5D", 'Ü' => "\x5E", '§' => "\x5F",
        '¿' => "\x60",
        'ä' => "\x7B", 'ö' => "\x7C", 'ñ' => "\x7D", 'ü' => "\x7E", 'à' => "\x7F",
        '^' => "\x1B\x14", '{' => "\x1B\x28", '}' => "\x1B\x29", '\\' => "\x1B\x2F", '[' => "\x1B\x3C", '~' => "\x1B\x3D", ']' => "\x1B\x3E", '|' => "\x1B\x40", '€' => "\x1B\x65"
        );
        $converted = strtr($string, $dict);
        
        // Replace unconverted UTF-8 chars from codepages U+0080-U+07FF, U+0080-U+FFFF and U+010000-U+10FFFF with a single ?
        return preg_replace('/([\\xC0-\\xDF].)|([\\xE0-\\xEF]..)|([\\xF0-\\xFF]...)/m','?',$converted);
        }
        
        /**
        * Count the number of GSM 03.38 chars a conversion would contain.
        * It's about 3 times faster to count than convert and do strlen() if conversion is not required.
        *
        * @param string $utf8String
        * @return integer
        */
        public static function countGsm0338Length($utf8String)
        {
        $len = mb_strlen($utf8String,'utf-8');
        $len += preg_match_all('/[\\^{}\\\~€|\\[\\]]/mu',$utf8String,$m);
        return $len;
        }
        
        /**
        * Pack an 8-bit string into 7-bit GSM format
        * Returns the packed string in binary format
        *
        * @param string $data
        * @return string
        */
        public static function pack7bit($data)
        {
        $l = strlen($data);
        $currentByte = 0;
        $offset = 0;
        $packed = '';
        for ($i = 0; $i < $l; $i++) {
        // cap off any excess bytes
        $septet = ord($data[$i]) & 0x7f;
        // append the septet and then cap off excess bytes
        $currentByte |= ($septet << $offset) & 0xff;
        // update offset
        $offset += 7;
        
        if ($offset > 7) {
        // the current byte is full, add it to the encoded data.
        $packed .= chr($currentByte);
        // shift left and append the left shifted septet to the current byte
        $currentByte = $septet = $septet >> (7 - ($offset - 8 ));
        // update offset
        $offset -= 8; // 7 - (7 - ($offset - 8))
        }
        }
        if ($currentByte > 0) $packed .= chr($currentByte); // append the last byte
        
        return $packed;
        }}
    • Boca de Pez Boca de Pez
      6

      Bien, ahora alguien me puede ayudar por favor. tengo una…

      Bien, ahora alguien me puede ayudar por favor.

      tengo una variable con el texto, $text ..... Como puedo utilizar el codigo anterior??

      Gracias.

      x cierto, esto lo hago por hoby y para aprender ....

      • Boca de Pez Boca de Pez
        6

        Sí, ahora el que te puede ayudar eres tú mismo. Aprende un…

        Sí, ahora el que te puede ayudar eres tú mismo. Aprende un poco más, y verás lo satisfactorio que es, en vez de que te lo mastiquen aquí.

    • Boca de Pez Boca de Pez
      6

      Gracias por nada ..... pensaba que los foros eran para ayudar…

      Gracias por nada .....

      pensaba que los foros eran para ayudar ... tus comentarios no aportan nada!! para eso, mejor te quedas calladito.

      bno, por si acaso le sirve a alguien ..

      Por lo que veo es una clase --- class GsmEncoder
      con tres funciones:
      - public static function utf8_to_gsm0338($string)
      - public static function countGsm0338Length($utf8String)
      - public static function pack7bit($data)

      yo en otro PHP tengo el txt almacenado en una variable ($texto).

      $txgsm = new GsmEncoder();
      echo "encoding gsm338 ";
      echo $txgsm->utf8_to_gsm0338($texto);

      se crea el nuevo objeto y accedo a las funciones.