解决CEMAPI发送中文短信时会乱码

本文介绍使用CEMAPI发送短信时遇到的Unicode保存问题及其解决方案。通过设置短信内容为Unicode类型,确保消息能够正确地被系统识别与处理。

作者:陈缘
联系:luandao2000@gmail.com
博客:http://blog.youkuaiyun.com/luandao2000
主页:http://www.spbase.com

这个问题 所有用CEMAPI发送短信的同志都会碰到,问题的根本在于 保存时sms的内容没有按照unicode类型保存。设置成unicode的类型就搞定了。

代码如下:
         IMAPIFolder* pCurFolder = GetMsgFolder(ID_DRAFTS);

SPropValue Data[3];
SPropValue propVals[1];

MAPINAMEID mapiNameId;
ZeroMemory(&mapiNameId, sizeof(mapiNameId));
GUID PS_MAPI = {0x00020328, 0, 0, 0xC0,0,0,0,0,0,0,0x46};
mapiNameId.lpguid = (LPGUID)&PS_MAPI;
mapiNameId.ulKind = MNID_STRING;
mapiNameId.Kind.lpwstrName = L"SMS:Unicode";
LPMAPINAMEID pmapiNameId = &mapiNameId;
LPSPropTagArray psPropArr = NULL;

hr=pCurFolder->CreateMessage(NULL,0,&pMessage);
if(FAILED(hr))
goto Exit;


hr = pMessage->GetIDsFromNames(1, &pmapiNameId, MAPI_CREATE, &psPropArr);
if (FAILED(hr))
{
if (NULL != psPropArr)
{
MAPIFreeBuffer(psPropArr);
psPropArr = NULL;
}
pMessage->Release();
pCurFolder->Release();
return hr;
}
if (NULL != psPropArr)
{
propVals[0].ulPropTag = CHANGE_PROP_TYPE(psPropArr[0].aulPropTag[0], PT_BOOLEAN);
propVals[0].Value.b = TRUE;
hr = pMessage->SetProps(1, propVals, NULL);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
MAPIFreeBuffer(psPropArr);
psPropArr = NULL;
pMessage->Release();
pCurFolder->Release();
return hr;
}
MAPIFreeBuffer(psPropArr);
}


//Data[0].ulPropTag = PR_SUBJECT;
//Data[0].Value.lpszW =pSms->szSubject;


Data[0].ulPropTag = PR_SUBJECT;
Data[0].Value.lpszW =pSms->szSubject;


Data[1].ulPropTag = PR_MSG_STATUS;
Data[1].Value.ul  = MSGSTATUS_RECTYPE_SMS;

Data[2].ulPropTag = PR_MESSAGE_FLAGS;
Data[2].Value.ul  = MSGFLAG_UNSENT|MSGFLAG_FROMME;

pMessage->SetProps(sizeof(Data)/sizeof(Data[0]),(LPSPropValue)Data,NULL);

SetMsgRecipient(pMessage, pSms);

hr = pMessage->SubmitMessage(0); 

<think>好的,用户的问题是关于air780e模块在发送英文短信时出现汉字乱码的原因和解决方法。首先,我需要了解这个模块的基本情况。Air780e通常用于物联网设备,支持短信通信。用户提到在英文环境下发送短信时汉字显示为乱码,这可能涉及字符编码的问题。 首先,可能的原因之一是字符编码设置不正确。短信通常使用GSM 7-bit、UCS-2或UTF-8等编码。如果模块被配置为英文环境,默认可能使用GSM 7-bit,而这种编码不支持中文字符,导致乱码。需要检查模块的编码设置是否正确。 其次,PDU模式是否启用。有些模块在发送短信时需要使用PDU模式来支持Unicode,而Text模式可能仅支持ASCII字符。如果用户使用的是Text模式,可能需要切换到PDU模式。 另外,短信中心设置是否正确也可能影响。短信中心需要支持Unicode编码,否则即使发送正确,接收方可能无法解码。此外,AT命令的参数是否正确设置,比如是否指定了正确的编码方式,也是需要检查的点。 解决方案方面,首先应该确认模块是否设置为UCS-2或UTF-8编码。通过发送AT命令如AT+CSCS="UCS2"来调整。其次,切换到PDU模式发送短信,确保数据以十六进制Unicode编码格式发送。同时,短信中心号码的编码是否正确,可能需要使用Unicode格式的号码。 最后,可能需要检查模块的固件版本,确保支持所需的编码方式,或者联系厂商获取支持。测试发送纯英文短信是否正常,可以帮助排除其他问题。如果问题依旧,可能需要更深入的调试或日志分析。</think>### Air780E模块发送短信汉字乱码问题分析 #### 一、原因分析 1. **字符编码不匹配** - 短信协议默认使用GSM 7-bit编码(仅支持英文字符)[^1] - 中文字符需要Unicode编码(UCS-2或UTF-8)支持,若未显式指定编码方式,模块可能以默认ASCII模式处理 - 示例:汉字"测试"的Unicode编码为$6D4B$8BD5$ 2. **PDU模式未启用** - 模块在Text模式下可能无法正确处理多字节字符 - 需要使用PDU模式发送Unicode短信,通过AT命令控制: ```AT+CMGF=0```(设置PDU模式) 3. **短信中心配置异常** - 短信中心号码未采用Unicode编码格式 - 编码格式可通过AT命令验证: ```AT+CSCS?```(查询当前字符集) #### 二、解决方案 1. **强制指定Unicode编码** ```AT+CSCS="UCS2"``` 此命令将字符集设置为UCS-2编码,支持中文字符传输[^2] 2. **PDU模式发送示例** ```AT+CMGS=<length> <PDU data>``` - 其中`<PDU data>`需包含: - 短信中心号码(Unicode格式) - 目标号码(Unicode格式) - 消息内容(十六进制Unicode编码) 3. **编码转换工具使用** ```python def str_to_unicode_hex(text): return ''.join([f"{ord(c):04X}" for c in text]) # 示例:转换"你好"为Unicode print(str_to_unicode_hex("你好")) # 输出4F60597D ``` #### 三、验证流程 1. 发送测试命令: ```AT AT+CSCS="UCS2" AT+CMGF=0 AT+CMGS=XX```(XX为PDU长度) 2. 通过示波器或串口调试工具确认实际发送数据是否符合3GPP 23.040协议标准 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值