使用AT命令发送包含'æøå'的短信

时间:2013-10-26 10:08:56

标签: php at-command

我正在为我正在进行的项目制作短信发送功能。代码工作正常,但是 当我发送字母'æ-ø-å-Æ-Ø-Å'时,它变为'f-x-e-F-X-E'。

如何更改编码以便我可以发送这些字母?

这是我的代码:

<?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");
}
?>

1 个答案:

答案 0 :(得分:0)

首先,您必须认真重做AT命令处理

  • 读取并解析从调制解调器返回的每一条响应行,直到您获得每个命令行调用的最终结果代码,无任何例外。有关详细信息,请参阅this answer
  • 对于AT+CMGS,您还必须在发送数据之前等待“\ n \ r&gt;”响应,有关详细信息,请参阅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编码中至少有一个应该支持æøå字符,但是你必须做一些非常自定义的翻译,那些角色会有二进制值与其他地方的文本非常不同。