2012-12-12 1 views
3

Je m'efforce d'envoyer le texte arabe du fournisseur de sms de clickatell using php, mais tout que j'ai pu envoyer pourtant est le texte embrouillé. Le texte que j'utilise pour tester est "غثس هفس".Le texte arabe de Clickatell se brouille

J'ai essayé d'encoder le texte du message aux formats Windows-1256,1250 et ISO-8859-6 en utilisant iconv mais à chaque fois il envoie seulement des textes brouillés.

Quelqu'un peut-il s'il vous plaît me donner quelques indications sur ce qui me manque?

Merci à l'avance

+0

Est-ce que la documentation Clickatell spécifier tout codage? Cela peut également varier selon la langue/le transporteur et/ou le téléphone de réception. – deceze

+0

Je n'ai vu aucun détail d'encodage spécifique dans les documents clickatell. En ce moment, je suis à court d'idées sur ce qu'il faut essayer :) :) Merci pour la réponse – pinaki

Répondre

3

Ok, ceci est pour celui qui vient sur ce chemin plus tard. Trouvé la solution here code de retenue réponse de Esailija

<?php 
$text = "غثس هفس خن"; 
$arr = unpack('H*hex', iconv('UTF-8', 'UCS-2BE', $text)); 
$message = strtoupper($arr['hex']); 

$username = ''; 
$password = ''; 
$API_ID = ''; 
$to = ''; 

$url = "http://api.clickatell.com/http/auth?user=$username&password=$password&api_id=$API_ID"; 
$ret = file($url); 
$sess = explode(":",$ret[0]); 
if ($sess[0] == "OK") { 
    $sess_id = trim($sess[1]); 
    $url = "http://api.clickatell.com/http/sendmsg?session_id=$sess_id&to=$to&text=$message&unicode=1"; 
    $ret = file($url); 
    $send = explode(":",$ret[0]); 

    if ($send[0] == "ID") { 
     echo "success - message ID: ". $send[1]; 
    } else { 
     echo "send message failed"; 
    } 
} else { 
    echo "Authentication failure: ". $ret[0]; 
} 
+0

Assez gentil trouver qu'il doit être codé en hexadécimal ad hoc, au lieu de codage pour cent standard .. – Esailija

1

Basé sur this, la valeur par défaut est GSM, mais vous pouvez également choisir UCS2.

Alors:

<?php 
           //Make sure the PHP source file is physically 
           //saved in utf-8 
$text = rawurlencode(iconv("UTF-8", "UCS-2", "غثس هفس ")); 

$url = "http://api.clickatell.com/http/auth?user=username&password=password&api_id=API_ID&encoding=UCS2"; 
$ret = file($url); 
$sess = explode(":",$ret[0]); 
if ($sess[0] == "OK") { 

    $sess_id = trim($sess[1]); 
    $url = "http://api.clickatell.com/http/sendmsg?session_id=$sess_id&to=$to&text=$text&encoding=UCS2"; 
    $ret = file($url); 
    $send = explode(":",$ret[0]); 

    if ($send[0] == "ID") { 
     echo "successnmessage ID: ". $send[1]; 
    } else { 
     echo "send message failed"; 
    } 
} else { 
    echo "Authentication failure: ". $ret[0]; 
} 
+0

. J'ai essayé le même code (copier/coller), mais il a quand même envoyé du texte poubelle en tant que sms. Des conseils sur la façon dont je voudrais envoyer en mode GSM? – pinaki

+0

Trouvé la solution. S'il vous plaît vérifier ma réponse ci-dessous. Merci encore pour votre aide. – pinaki

1

Je réécris le code Clickatell pour Vtiger 6 afin qu'il puisse accueillir UTF-8 caractères étendus. J'utilise le turc. J'utilise le code ci-dessous pour la conversion. J'espère que vous pouvez porter.

/** 
* Function to handle UTF-8 Check and conversion 
* @author Nuri Unver 
* 
*/ 
public function smstxtcode($data){ 
$mb_hex = ''; 
$utf = 0; 
for($i = 0 ; $i<mb_strlen($data,'UTF-8') ; $i++){ 
    $c = mb_substr($data,$i,1,'UTF-8'); 

    $o = unpack('N',mb_convert_encoding($c,'UCS-4BE','UTF-8')); 
    $hx = sprintf('%04X',$o[1]); 
    $utf += intval(substr($hx,0,2)); 
    $mb_hex .= $hx; 
} 
if ($utf>0) 
{ 
    $return=$mb_hex; 
    $utf=1; 
} 
else 
{ 
    $return=utf8_decode($data); 
    $utf=0; 
} 
return array($utf,$return); 

} 

Vous appelez cette fonction avec votre message. La réponse que vous obtenez est un tableau indiquant d'envoyer un texte unicode ou normal selon le message et le texte à envoyer. S'il n'y a pas de caractères étendus, il l'envoie simplement en texte brut avec unicode = 0 afin de sauvegarder les caractères. Si le message contient des caractères étendus, il convertit le message en code hexadécimal et l'envoie en tant qu'unicode.

Ce code fait simplement les calculs. Vous devez implémenter votre propre code pour le porter sur votre système. Pour la démonstration c'est le code que j'utilise pour Vtiger extraire les données et envoyer le message:

/** 
* Function to handle SMS Send operation 
* @param <String> $message 
* @param <Mixed> $toNumbers One or Array of numbers 
*/ 
public function send($message, $toNumbers) { 
    if(!is_array($toNumbers)) { 
     $toNumbers = array($toNumbers); 
    } 
    $params = $this->prepareParameters(); 
    $smsarray = $this->smstxtcode($message); 
    $params['text'] = $smsarray[1]; 
    $params['unicode'] = $smsarray[0]; 
    $params['to'] = implode(',', $toNumbers); 
    $serviceURL = $this->getServiceURL(self::SERVICE_SEND); 
+0

nice, merci pour l'info :) – pinaki

1

Réponse courte: vous devez faire deux choses:

a) Convertissez votre message arabe:

$ data = iconv ("UTF-8", "UCS-2BE", $ data); $ data = bin2hex ($ data);

Utilisez la chaîne résultante comme texte de votre message

b) Lors de l'envoi via l'API HTTP, incluez le paramètre unicode:

& unicode = 1