質問

私はそれを呼び出してテキストを渡すコード/libをPHPのコード/libを探しています、そしてそれは私に教えてくれます:

  1. このテキストをSMS(7,8,16ビット)として送信するために使用する必要があるエンコードは何ですか(7,8,16ビット)
  2. このテキストを送信するために使用するSMSメッセージの数( http://ozekisms.com/index.php?owpn=612)

私のためにこれを行うコード/libが存在するものはありますか?

繰り返しますが、テキストに関する情報を提供するために、SMSの送信やSMSの変換を探していません。

アップデート:

わかりました、私は以下のコードをしました、そしてそれは正常に動作しているようです、あなたがより良い/最適化されたコード/ソリューション/libを持っているかどうか教えてください

$text = '\@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ -./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}[~]|€' ; //"\\". //'"';//' ';

print $text . "\n";
print isGsm7bit($text). "\n";
print getNumberOfSMSsegments($text). "\n";




function getNumberOfSMSsegments($text,$MaxSegments=6){
/*
http://en.wikipedia.org/wiki/SMS

Larger content (concatenated SMS, multipart or segmented SMS, or "long SMS") can be sent using multiple messages, 
in which case each message will start with a user data header (UDH) containing segmentation information. 
Since UDH is part of the payload, the number of available characters per segment is lower: 
153 for 7-bit encoding, 
134 for 8-bit encoding and 
67 for 16-bit encoding. 
The receiving handset is then responsible for reassembling the message and presenting it to the user as one long message. 
While the standard theoretically permits up to 255 segments,[35] 6 to 8 segment messages are the practical maximum, 
and long messages are often billed as equivalent to multiple SMS messages. See concatenated SMS for more information. 
Some providers have offered length-oriented pricing schemes for messages, however, the phenomenon is disappearing.
*/
$TotalSegment=0;
$textlen = mb_strlen($text);
if($textlen==0) return false; //I can see most mobile devices will not allow you to send empty sms, with this check we make sure we don't allow empty SMS

if(isGsm7bit($text)){ //7-bit
    $SingleMax=160;
    $ConcatMax=153;
}else{ //UCS-2 Encoding (16-bit)
    $SingleMax=70;
    $ConcatMax=67;
}

if($textlen<=$SingleMax){
    $TotalSegment = 1;
}else{
    $TotalSegment = ceil($textlen/$ConcatMax);
}

if($TotalSegment>$MaxSegments) return false; //SMS is very big.
return $TotalSegment;
}

function isGsm7bit($text){
$gsm7bitChars = "\\\@£\$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}[~]|€";
$textlen = mb_strlen($text);
for ($i = 0;$i < $textlen; $i++){
    if ((strpos($gsm7bitChars, $text[$i])==false) && ($text[$i]!="\\")){return false;} //strpos not able to detect \ in string
}
return true;
}
役に立ちましたか?

解決 2

私がこれまでに持っている最良の解決策:

$text = '\@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ -./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}[~]|€' ; //"\\". //'"';//' ';

print $text . "\n";
print isGsm7bit($text). "\n";
print getNumberOfSMSsegments($text). "\n";

function getNumberOfSMSsegments($text,$MaxSegments=6){
/*
http://en.wikipedia.org/wiki/SMS

Larger content (concatenated SMS, multipart or segmented SMS, or "long SMS") can be sent using multiple messages, 
in which case each message will start with a user data header (UDH) containing segmentation information. 
Since UDH is part of the payload, the number of available characters per segment is lower: 
153 for 7-bit encoding, 
134 for 8-bit encoding and 
67 for 16-bit encoding. 
The receiving handset is then responsible for reassembling the message and presenting it to the user as one long message. 
While the standard theoretically permits up to 255 segments,[35] 6 to 8 segment messages are the practical maximum, 
and long messages are often billed as equivalent to multiple SMS messages. See concatenated SMS for more information. 
Some providers have offered length-oriented pricing schemes for messages, however, the phenomenon is disappearing.
*/
$TotalSegment=0;
$textlen = mb_strlen($text);
if($textlen==0) return false; //I can see most mobile devices will not allow you to send empty sms, with this check we make sure we don't allow empty SMS

if(isGsm7bit($text)){ //7-bit
    $SingleMax=160;
    $ConcatMax=153;
}else{ //UCS-2 Encoding (16-bit)
    $SingleMax=70;
    $ConcatMax=67;
}

if($textlen<=$SingleMax){
    $TotalSegment = 1;
}else{
    $TotalSegment = ceil($textlen/$ConcatMax);
}

if($TotalSegment>$MaxSegments) return false; //SMS is very big.
return $TotalSegment;
}

function isGsm7bit($text){
$gsm7bitChars = "\\\@£\$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}[~]|€";
$textlen = mb_strlen($text);
for ($i = 0;$i < $textlen; $i++){
    if ((strpos($gsm7bitChars, $text[$i])==false) && ($text[$i]!="\\")){return false;} //strpos not     able to detect \ in string
}
return true;
}

他のヒント

以前の答えが完全に正しくないので、ここにいくつかの追加情報を追加しています。

これらは問題です:

  • 君は 必要 MB_STRINGにエンコードする現在の文字列を指定するには、それ以外の場合、これが誤って収集される可能性があります
  • 7ビットGSMエンコードでは、基本的なcharSet拡張文字(^{} [〜] |€)がそれぞれ14ビットを必要とするため、それぞれ2文字としてカウントされます。
  • UCS-2エンコーディングでは、16ビットBMP以外の絵文字や他のキャラクターに注意する必要があります。
  • UCS-2を持つGSMは16ビット文字をカウントするため、💩文字(U+1F4A9)があり、キャリアと電話がUCS-2だけでなくUTF-16をこっそりサポートしている場合、代理ペアとしてエンコードされますUTF-16の16ビット文字であるため、文字列の長さに向けて2つの16ビット文字としてカウントされます。 mb_strlen これは単一の文字のみとしてカウントされます。

7ビット文字をカウントする方法:

私がこれまでに思いついたのは、7ビット文字をカウントするための次のことです。

// Internal encoding must be set to UTF-8,
// and the input string must be UTF-8 encoded for this to work correctly
protected function count_gsm_string($str)
{
    // Basic GSM character set (one 7-bit encoded char each)
    $gsm_7bit_basic = "@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà";

    // Extended set (requires escape code before character thus 2x7-bit encodings per)
    $gsm_7bit_extended = "^{}\\[~]|€";

    $len = 0;

    for($i = 0; $i < mb_strlen($str); $i++) {
        if(mb_strpos($gsm_7bit_basic, $str[$i]) !== FALSE) {
            $len++;
        } else if(mb_strpos($gsm_7bit_extended, $str[$i]) !== FALSE) {
            $len += 2;
        } else {
            return -1; // cannot be encoded as GSM, immediately return -1
        }
    }

    return $len;
}

16ビット文字をカウントする方法:

  • 文字列をUTF-16表現に変換します(絵文字の文字を保存するには mb_convert_encoding($str, 'UTF-16', 'UTF-8').
    • しない これは損失があるので、UCS-2に変換します mb_convert_encoding)
  • でバイトをカウントします count(unpack('C*', $utf16str)) 2つで分割して、GSMマルチパートの長さにカウントされるUCS-2 16ビット文字の数を取得します

*警告emptor、バイトをカウントする言葉:

  • しない 使用する strlen バイト数をカウントします。うまくいくかもしれませんが、 strlen 多くの場合、Multibyte対応バージョンを備えたPHPインストールで過負荷になり、将来のAPI変更の候補者でもあります
  • 避ける mb_strlen($str, 'UCS-2'). 。それはそうです 現在 作業、そして正しく戻り、2つのうんちのキャラクターのために2つを返します(2つの16ビットUCS-2文字のように見えるので)、その安定した mb_convert_encoding > 16ビットからUCS-2に変換すると、損失があります。 MB_STRLENは将来的には喪失しないと誰が言うのですか?
  • 避ける mb_strlen($str, '8bit') / 2. 。また 現在 機能し、バイトをカウントする方法としてPHP Docsコメントで推奨されます。しかし、IMOは上記のUCS-2手法と同じ問題に苦しんでいます。
  • それは最も安全な現在の方法を残します(IMO) なので unpackバイト配列に入力し、それをカウントします。

それで、これはどのように見えますか?

// Internal encoding must be set to UTF-8,
// and the input string must be UTF-8 encoded for this to work correctly
protected function count_ucs2_string($str)
{
    $utf16str = mb_convert_encoding($str, 'UTF-16', 'UTF-8');
    // C* option gives an unsigned 16-bit integer representation of each byte
    // which option you choose doesn't actually matter as long as you get one value per byte
    $byteArray = unpack('C*', $utf16str);
    return count($byteArray) / 2;
}

すべてを一緒に入れて:

function multipart_count($str)
{
    $one_part_limit = 160; // use a constant i.e. GSM::SMS_SINGLE_7BIT
    $multi_limit = 153; // again, use a constant
    $max_parts = 3; // ... constant

    $str_length = count_gsm_string($str);
    if($str_length === -1) {
        $one_part_limit = 70; // ... constant
        $multi_limit = 67; // ... constant
        $str_length = count_ucs2_string($str);
    }

    if($str_length <= $one_part_limit) {
        // fits in one part
        return 1;
    } else if($str_length > ($max_parts * $multi_limit) {
        // too long
        return -1; // or throw exception, or false, etc.
    } else {
        // divide the string length by multi_limit and round up to get number of parts
        return ceil($str_length / $multi_limit);
    }
}

これを図書館に変えました...

https://bitbucket.org/solvam/smstools

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top