【问题标题】:Differences with chr() function between PHP 5.6 and 7PHP 5.6 和 7 与 chr() 函数的区别
【发布时间】:2016-09-14 00:42:02
【问题描述】:

我下载了以下代码from a website,用于对通过其网关发送的短信中的 GSM 字符进行编码。

这是我的测试代码:

$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 中运行?确保它在两个版本中运行的最佳方法是什么?

【问题讨论】:

  • chr() 需要一个整数作为参数。您正在传递一个包含十六进制值的字符串。所以你想先调用hexdec(),因为正如你看到的那样,PHP 7 现在会抛出一个通知,因为它不再将十六进制字符串视为数字,请参阅:php.net/manual/en/…
  • 在 PHP 7 之前的版本中,十六进制字符串被认为是数字,因此在数字上下文中被转换为整数。
  • @Rizier123 hexdec() 没用。但是将它们作为整数传递是解决方案。错过了!

标签: php php-7 chr


【解决方案1】:

如果我错了,请纠正我,但将十六进制值包含在引号中会将其转换为字符串?

基本上,从值周围删除单引号,例如

'Δ'=>'0xD0',

'Δ'=>0xD0,

因此将 chr 传递给一个有效的整数

编辑:刚刚测试了这个理论,我似乎是正确的:

<?php

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

结果:

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

在 PHP 手册中 chr 取 1 个 int 值:

string chr ( int $ascii )

【讨论】:

  • 这就是解决方案!谢谢!
  • 完成!抱歉,我一定是赶上了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2017-11-09
  • 1970-01-01
  • 2017-09-10
  • 2013-06-27
  • 2019-09-25
  • 1970-01-01
相关资源
最近更新 更多