3

ゲートウェイを介して送信された SMS メッセージで GSM 文字をエンコードするために、Web サイトから次のコードをダウンロードしました。

ここに私のテストコードがあります:

$body = '£¥$@"\'.,;:_-=+*#%&<>?!¿¡§¤()ÄÖÑÜÉÅßÇÆΦΓΔΛΩΣΠΨΘØΞñüäòøàæåèéöùì{}[]|~^€';

$characters = array(
    'Δ'=>'0xD0', 'Φ'=>'0xDE', 'Γ'=>'0xAC', 'Λ'=>'0xC2',
    'Ω'=>'0xDB', 'Π'=>'0xBA', 'Ψ'=>'0xDD', 'Σ'=>'0xCA',
    'Θ'=>'0xD4', 'Ξ'=>'0xB1', '¡'=>'0xA1', '£'=>'0xA3',
    '¤'=>'0xA4', '¥'=>'0xA5', '§'=>'0xA7', '¿'=>'0xBF',
    'Ä'=>'0xC4', 'Å'=>'0xC5', 'Æ'=>'0xC6', 'Ç'=>'0xC7',
    'É'=>'0xC9', 'Ñ'=>'0xD1', 'Ö'=>'0xD6', 'Ø'=>'0xD8',
    'Ü'=>'0xDC', 'ß'=>'0xDF', 'à'=>'0xE0', 'ä'=>'0xE4',
    'å'=>'0xE5', 'æ'=>'0xE6', 'è'=>'0xE8', 'é'=>'0xE9',
    'ì'=>'0xEC', 'ñ'=>'0xF1', 'ò'=>'0xF2', 'ö'=>'0xF6',
    'ø'=>'0xF8', 'ù'=>'0xF9', 'ü'=>'0xFC',
);
$message = '';
if(mb_detect_encoding($body, 'UTF-8') != 'UTF-8') {
    $body = utf8_encode($body);
}
for ($i = 0; $i < mb_strlen($body, 'UTF-8'); $i++) {
    $c = mb_substr($body, $i, 1, 'UTF-8');
    if (isset($characters[$c])) {
        $message .= chr($characters[$c]);  //Line 53
    } else {
        $message .= $c;
    }
}

echo $message;

PHP 5.6 でコードを実行すると、SMS 経由で送信するメッセージが正しくエンコードされます。

ただし、PHP 7 で実行すると、次のエラーが発生し、機能しません。

注意: /var/www/html/public/test.php の 53 行目で、整形式でない数値が見つかりました

char()のドキュメントで、ASCII コードを受け入れることに気付きました。現在のコードが PHP 5.6 で動作し、7 では動作しないのはなぜですか? また、両方のバージョンで確実に動作するようにする最善の方法は何でしょうか?

4

1 に答える 1

5

間違っている場合は訂正してください。ただし、16 進数の値を引用符で囲むと文字列になりますか?

基本的に、値を囲む一重引用符を削除します。

'Δ'=>'0xD0',

'Δ'=>0xD0,

したがって、chr に有効な整数を渡します

編集:この理論をテストしたところ、私は正しいようです:

<?php

var_dump('0xD0');
var_dump(0xD0);

結果:

string(4) "0xD0"
int(208)

PHP マニュアルでは、chr は 1 つの int 値を取ります。

string chr ( int $ascii )
于 2016-09-14T00:48:38.413 に答える