BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

PHP - SMS

BocaDePez

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

BocaDePez
function validarparaGSM7($string) { return (preg_match('/^[\x{20}-\x{7E}£¥èéùìòÇ\rØø\nÅåΔ_ΦΓΛΩΠΨΣΘΞ\x{1B}ÆæßÉ ¤¡ÄÖÑܧ¿äöñüà\x{0C}€]*$/u' , $string) === 1);}

Los caracteres están tomados de la tabla que aparece en en.wikipedia.org/wiki/GSM_03.38

🗨️ 3
BocaDePez

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.

🗨️ 2
BocaDePez

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.

🗨️ 1
BocaDePez

gracias

BocaDePez
BocaDePez
🗨️ 2
BocaDePez
BocaDePez
🗨️ 1
BocaDePez
BocaDePez
BocaDePez

(link roto) … er.class.php

BocaDePez

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 ....

🗨️ 2
BocaDePez

Contrata a un programador.

🗨️ 1
BocaDePez

Gracias de todos modos .. pero eso no ha ayudado

BocaDePez
🗨️ 1
BocaDePez
/**
* Class capable of encoding GSM 03.38 default alphabet and packing octets into septets as described by GSM 03.38.
* Based on mapping:unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
*
* Copyright (C) 2011 OnlineCity
* Licensed under the MIT license, which can be read at: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;
}}
BocaDePez

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 ....

🗨️ 1
BocaDePez

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í.

BocaDePez

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.