我使用 Python 在连接到 GSM 模块的 Raspberry Pi 4B 上构建了一个 SMS 服务器。这是我使用 Waveshare Wiki 的 GSM 模块。我可以向我的客户发送短信,告知他们有关订单的信息。
我的问题是我无法发送像“ÄäÖöÜü”这样的变音符号和像“ß”这样的特定字符。每当我尝试将它们发送到我自己的手机时,它们都会被其他字符取代。例如,“ä”被“@¤”取代。
我使用 AT+CSCS="GSM" 将模块设置为 GSM 字符集,并使用 AT+CMGF=1 以纯文本形式发送 SMS。 我的主要问题是:有谁知道我可以尝试正确发送变音符号吗?
变音符号全部正确传输到 SMS 服务器,然后服务器使用 pySerial 库将它们发送到 GSM 模块。
serial.write(sms_text.encode('utf-8'))
我想可能GSM模块的字符集没有变音符号。每个 GSM 模块是否有自己的字符集或是否有相应的标准?
根据SIM 800 AT命令手册,在3.2.12段,模块支持以下字符集:
“GSM” - GSM 7 位默认字母表 (3GPP TS 23.038);
"UCS2" - 16 位通用多八位字节编码字符集 (ISO/IEC10646); UCS2字符串转换为16进制数,从0000到FFFF;例如"004100620063" 等于十进制值 65、98 和 99 的三个 16 位字符
“IRA” - 国际参考字母表 (ITU-T T.50)
"HEX" - 字符串仅由从 00 到 FF 的十六进制 bers 组成;
"PCCP" - PC字符集代码
“PCDN” - PC 丹麦语/挪威语字符集“8859-1”ISO 8859 拉丁语 1 字符集
在你的情况下,我会尝试至少两个选项:
PCDN - 丹麦语/挪威语字符集
发送指令
AT+CSCS="PCDN"
将字符正常写入串口。此字符集支持您需要的字符,如本代码表中所述。
UCS2 - Unicode
发送指令
AT+CSCS="UCS2"
并且,对于每一个你需要打印的字符,将其代码对应的4个十六进制字符写入serial,如下面的代码表.
例如,字符
Ö
可以通过向+CMGS
命令写入代码00D6
.来获得
如果第一个解决方案有效,你就没事了。第二种解决方案的缺点是需要对要发送的每个字符进行编码,但可以让您准备好支持世界上几乎所有字符集。