2013-10-26 62 views
1

我正在爲正在處理的項目製作短信發送功能。該代碼工作得很好,但當我發送字母'æ-ø-å-Æ-Ø-Å'時,它會變成'f-x-e-F-X-E'。用AT命令發送包含'æøå'的短信

如何更改編碼以便我可以發送這些字母?

這是我的代碼:

<?php 
include "php_serial.class.php"; 

$html = $_POST['msg']; 

$serial = new phpSerial; 
$serial->deviceSet("/dev/cu.HUAWEIMobile-Modem"); 
$serial->deviceOpen(); 

$serial->sendMessage("ATZ\n\r"); 
// Wait and read from the port 
var_dump($serial -> readPort()); 

$serial->sendMessage("ATE0\n\r"); 
// Wait and read from the port 
var_dump($serial -> readPort()); 

// To write into 
$serial->sendMessage("AT+cmgf=1;+cnmi=2,1,0,1,0\n\r");// 
$serial->sendMessage("AT+cmgs=\"+45{$_POST['number']}\"\n\r"); 
$serial->sendMessage("{$html}\n\r"); 
$serial->sendMessage(chr(26)); 

//wait for modem to send message 
sleep(3); 

$read=$serial->readPort(); 
$serial->deviceClose(); 

$read = preg_replace('/\s+/', '', $read); 
$read = substr($read, -2); 

if($read == "OK") { 
    header("location: index.php?send=1"); 
} else { 
    header("location: index.php?send=2"); 
} 
?> 
+0

http://stackoverflow.com/a/4248655/477878 –

回答

0

首先,你必須認真重做AT命令處理,以

  • 閱讀和解析的從調制解調器還給每一個響應行直到你得到每一個命令行調用的最終結果代碼,沒有任何例外。有關更多詳細信息,請參閱this answer
  • 對於AT+CMGS特別是你也必須發送數據前等待「\ n \ r>」響應,請參閱this answer瞭解更多詳情。

現在回答你的問題有關æøå變成fxe,這是ISO 8859-1編碼的最顯著位的古典剝離(我幾乎已經忘記了)。這可能是由於缺省的字符編碼造成的,但是由於總是應該是明確的,並且在任何情況下都要設置要使用的字符編碼,因此進一步調查結果是沒有價值的。用於字符串到AT命令的字符編碼由AT+CSCS命令控制(有關更多詳細信息,請參閱this answer),請運行AT+CSCS=?以獲取選項列表。

根據您的信息,您似乎使用ISO 8859-1,因此運行AT+CSCS="8859-1"將停止調零MSB。你可能會滿意,但我強烈建議使用字符編碼UTF-8來代替,它比8859-1要好得多。

所有這些失敗我相當確信GMSIRA編碼中的至少一個應該支持字符,但是必須進行一些非常自定義的翻譯,那些字符將具有與在別處的文本中很常見