2016-09-14 57 views
3

我下載了以下代碼from a website,用於在通過其網關的SMS消息中編碼GSM字符。與PHP 5.6和7之間的chr()函數的差異

這裏是我的測試代碼:

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

$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的代碼,它正確編碼信息通過短信發送。

當我在PHP 7上運行然而,我收到以下錯誤,這是行不通的:

注意:在/ var/www/html等/公/測試中遇到的非井形成數值。 php 53行

我注意到char()的文檔中它接受ASCII碼。爲什麼當前的代碼工作在PHP 5.6而不是7,以及確保它在兩個版本中都能正常工作的最佳方式是什麼?

+3

'CHR()'預計的整數作爲參數。你正在傳遞一個包含十六進制值的字符串。所以你想調用第一個'hexdec()',因爲你會發現PHP 7現在會發出通知,因爲它不再認爲十六進制字符串是數字,請參閱:http://php.net/manual/烯/ migration70.incompatible.php#migration70.incompatible.strings.hex – Rizier123

+5

之前PHP 7十六進制字符串被認爲是數字,因此澆鑄在數值上下文的整數。 – Rizier123

+0

@ Rizier123'hexdec()'不起作用。但將它們作爲整數傳遞是解決方案。錯過了! –

回答

5

如果我錯了,請糾正我,但用引號括住十六進制值將它變成一個字符串?

基本上,刪除數值周圍的單引號,例如

'Δ'=>'0xD0', 

'Δ'=>0xD0, 

因此通過CHR有效的整數

編輯:剛剛測試這個理論,我似乎是正確的:

<?php 

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

結果:

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

在PHP手冊CHR需要1個int值:

string chr (int $ascii) 
+0

這就是解決方案!謝謝! –

+0

如果請求正確,你能接受這個答案嗎? –

+1

完成!對不起,我一定被抓住了! –