1

我正在为我正在从事的项目制作短信发送功能。代码工作得很好,但是当我发送字母“æ-ø-å-Æ-Ø-Å”时,它变成了“fxeFXE”。

如何更改编码以便我可以发送这些信件?

这是我的代码:

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

1 回答 1

1

首先,你必须认真地重做你的 AT 命令处理以

  • 读取并解析从调制解调器返回的每个响应行,直到您获得每个命令行调用的最终结果代码,没有任何例外。有关更多详细信息,请参阅此答案
  • 具体来说AT+CMGS,您还必须在发送数据之前等待“\n\r>”响应,有关更多详细信息,请参阅此答案

现在回答你关于æøå变成的问题fxe,这是对 ISO 8859-1 编码最重要位的经典剥离(我几乎忘记了)。这可能是由默认字符编码引起的,但由于您始终应该明确并设置您想要在任何情况下使用的字符编码,因此进一步调查是没有价值的。用于 AT 命令字符串的字符编码由AT+CSCS命令控制(有关更多详细信息,请参阅此答案),运行AT+CSCS=?以获取选项列表。

根据您的信息,您似乎使用的是 ISO 8859-1,因此运行AT+CSCS="8859-1"将停止将 MSB 归零。您可能对此感到满意,但我强烈建议使用字符编码UTF-8来代替,它比 8859-1 要好得多。

所有这些失败我很确定至少一个GMSorIRA编码应该支持æøå 字符,但是你必须做一些非常自定义的翻译,这些字符将具有与其他地方文本中常见的非常不同的二进制值。

于 2013-10-26T13:50:13.287 回答