2012-12-12 3 views
3

php를 사용하여 clickatell sms 공급자로부터 아랍어 텍스트를 보내려고했지만 아직 보낼 수있는 텍스트가 모두 왜곡되어 있습니다. 테스트를 위해 사용하는 텍스트는 "غثس هفس"입니다.Clickatell 아랍어 텍스트가 왜곡 됨

iconv를 사용하여 Windows-1256,1250 및 ISO-8859-6 형식으로 메시지 텍스트 인코딩을 시도했지만 everytimeit은 왜곡 된 텍스트를 보냅니다.

누구든지 제가 놓친 것에 대한 조언을 해 줄 수 있습니까? this을 바탕으로 사전

+0

1가하는 Clickatell 문서가 어떤 인코딩을 지정 하는가 = 다음 HTTP API를 통해 보낼 때

이 메시지 텍스트

B)로 결과 문자열을 사용하여 유니 코드 매개 변수를 포함? 이는 언어/이동 통신사 및/또는 수신 전화에 따라 다를 수 있습니다. – deceze

+0

나는 clickatell 문서의 특정 인코딩 세부 정보를 보지 못했습니다. 바로 지금 나는 다음에 무엇을 시도해야하는지에 대한 아이디어가 부족합니다. – pinaki

답변

3

좋아,이 나중에이 경로에 온다 누구를위한 것입니다. Esailija의 대답 나는 그래서 UTF-8 확장 된 문자를 수용 할 수 있음을 Vtiger 6하는 Clickatell 코드를 재 작성

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

꽤 좋은 그것이 표준 백분율 인코딩 대신에 애드혹 된 16 진수가 될 필요가 있음을 발견했습니다 .. – Esailija

1

에서

감사합니다, 기본은 GSM입니다하지만 당신은 UCS2를 선택할 수 있습니다.

그래서 :

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

답장을 보내 주셔서 감사합니다. 나는 동일한 코드 (복사/붙여 넣기)를 시도했지만 여전히 가비지 텍스트를 SMS로 보냈다. 내가 GSM 모드로 보낼 방법에 대한 모든 포인터? – pinaki

+0

해결책을 찾았습니다. 아래 내 대답을 확인하십시오. 도움에 다시 한번 감사드립니다. – pinaki

1

에서 솔루션 here 리테 이닝 코드를 발견했다. 나는 터키어를 사용한다. 나는 변환을 위해 아래의 코드를 사용한다. 나는 당신이 항구 수 있기를 바랍니다.

/** 
* 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); 

} 

이 기능을 메시지와 함께 호출합니다. 여러분이 얻게되는 응답은 메시지와 보낼 텍스트에 따라 유니 코드 또는 일반 텍스트를 보내는 것을 말합니다. 확장 문자가 없으면 문자를 저장하기 위해 unicode = 0 인 일반 텍스트로 보내기 만합니다. 메시지에 확장 문자가 포함되어 있으면 메시지를 16 진수로 변환하여 유니 코드로 보냅니다.

이 코드는 계산을 수행합니다. 자신의 코드를 구현하여 시스템에 포팅해야합니다. 데모를 위해 이것은 내가 Vtiger에 사용하는 코드는 데이터를 추출하고 메시지를 보내는 것입니다 :

/** 
* 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

정보, 감사합니다 :) – pinaki

1

짧은 답변 :

:

a)받은 아랍어 메시지를 변환 : 두 가지 작업을 수행해야 $ data = iconv ("UTF-8", "UCS-2BE", $ data); $ data = bin2hex ($ data);

& 유니 코드

관련 문제