3

php を使用して clickatell SMS プロバイダーからアラビア語のテキストを送信しようとしていますが、まだ送信できたのは文字化けしたテキストだけです。私がテストに使用しているテキストは「غثس وگ」です。

iconv を使用してメッセージ テキストを Windows-1256,1250 および ISO-8859-6 形式にエンコードしようとしましたが、毎回文字化けしたテキストが送信されます。

誰かが私が欠けているものへの指針を教えてもらえますか?

前もって感謝します

4

4 に答える 4

3

わかりました、これは後でこの道に来る人のためのものです。ここで解決策を見つけました Esailja's answer からコードを保持する

<?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];
}
于 2012-12-12T15:18:53.290 に答える
2

簡単な答え: 次の 2 つのことを行う必要があります。

a) アラビア語のメッセージを変換します:

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

結果の文字列をメッセージ テキストとして使用する

b) HTTP API 経由で送信する場合は、unicode パラメータを含めます。

&Unicode=1

于 2015-09-16T12:09:58.213 に答える
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];
}
于 2012-12-12T12:34:52.297 に答える
1

UTF-8 拡張文字に対応できるように、Vtiger 6 の ClickATell コードを書き直しました。私はトルコ語を使います。変換には以下のコードを使用します。移植できることを願っています。

/**
 * 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 進コードに変換し、Unicode として送信します。

このコードは計算を行うだけです。システムに移植するには、独自のコードを実装する必要があります。デモンストレーションのために、これは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);
于 2014-02-12T09:28:59.773 に答える