php 7 — Различия с функцией chr () между PHP 5.6 и 7

Я скачал следующий код с сайта для кодирования символов GSM в SMS-сообщениях, пропускаемых через их шлюз.

Вот мой тестовый код:

$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

Я замечаю в документах для символ () он принимает коды ASCII. Почему текущий код работает в PHP 5.6, а не в 7, и как лучше всего обеспечить его работу в обеих версиях?

3

Решение

Поправьте меня, если я ошибаюсь, но, заключив шестнадцатеричное значение в кавычки, превращает его в строку?

Как правило, удаляйте одинарные кавычки вокруг значений, например,

'Δ'=>'0xD0',

в

'Δ'=>0xD0,

Таким образом, передавая chr допустимое целое число

Изменить: Только что проверил эту теорию, и я, кажется, правильно:

<?php

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

Результаты в:

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

В руководстве по PHP chr принимает значение 1 int:

string chr ( int $ascii )
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]