我正在使用open-smpp库与SMSC进行通信。 我可以发送单个和多个SMS,但是我遇到了特殊字符(šđžć)的问题,在发送多个消息(sendMultiSMS)的情况下会出现'?'。
我在https://en.wikipedia.org/wiki/Short_Message_Peer-to-Peer读到,short_message字段中的文字必须与data_coding匹配。
PSB,代码部分有两种方法。 根据上面的wiki资源,我定义了表示data_coding的变量 DATA_CODING ,我尝试在short_message中对文本进行编码,如下所示: submitSM.setShortMessage(message.getMessage(),Data.ENC_UTF16); - 单条消息 ed.appendString(messageAux,Data.ENC_UTF16); - 多条消息
因此,对于单个消息,波纹管组合很好(DATA_CODING =(byte)0x08和Data.ENC_UTF16),字符正常,但对于多个短信,特殊字符将以“?”形式出现。
我尝试了所有组合,如:
DATA_CODING =(byte)0x01和Data.ENC_UTF16
DATA_CODING =(byte)0x08和Data.ENC_UTF16
DATA_CODING =(byte)0x01和Data.ENC_UTF8
DATA_CODING =(byte)0x08和Data.ENC_UTF8
等,但没有成功。
**private static final byte DATA_CODING = (byte) 0x08;**
public void sendSMS(XMessage message) throws SmppException
{
.
.
.
SubmitSM submitSM = new SubmitSM();
setScheduleDate(message, submitSM);
submitSM.setProtocolId(PROTOCOL_ID);
**submitSM.setDataCoding(DATA_CODING);**
submitSM.setSourceAddr(mSrcAddress);
submitSM.setDestAddr(mDestAddress);
submitSM.setSequenceNumber(message.getSequence());
**submitSM.setShortMessage(message.getMessage(), Data.ENC_UTF16);**
SubmitSMResp submitSMResp = mSession.submit(submitSM);
}
public void sendMultiSMS(XMessage message) throws SmppException
{
.
.
.
submitSMMulti = new SubmitSM();
submitSMMulti.setProtocolId(PROTOCOL_ID);
**submitSMMulti.setDataCoding(DATA_CODING);**
setScheduleDate(message, submitSMMulti);
submitSMMulti.setSourceAddr(mSrcAddress);
submitSMMulti.setDestAddr(mDestAddress);
submitSMMulti.setEsmClass((byte)0x40);
messageArray = XSMSProcessUtil.getMultiMessages(message.getMessage(), numSegments);
SubmitSMResp submitSMResp = null;
for(int count = 0; count < messageArray.length; count++)
{
submitSMMulti.setSequenceNumber(message.getSequence() + count);
messageAux = messageArray[count];
ByteBuffer ed = new ByteBuffer();
ed.appendByte((byte)5);
ed.appendByte((byte)0x00);
ed.appendByte((byte)3);
ed.appendByte((byte)message.getSequence());
ed.appendByte((byte)numSegments);
ed.appendByte((byte)(count +1));
**ed.appendString(messageAux, Data.ENC_UTF16);**
submitSMMulti.setShortMessageData(ed);
submitSMResp = mSession.submit(submitSMMulti);
}
}
答案 0 :(得分:1)
我使用此信息找到了解决方案
URL。
这是简短的解释:
GSM字符编码使用7位来表示每个字符, 非拉丁语字母语言通常使用支持的电话 Unicode格式。这些手机使用的特定字符编码是 通常是UTF-16或UCS-2。 UTF-16和UCS-2都使用16位 代表每个角色。标准SMS消息具有最大有效载荷 140字节(1120位)。对于使用16位的Unicode手机 字符编码,每个最多允许70个字符 标准的短信息。 UDH占用正常SMS的6个字节(48位) 消息有效载荷所以 每个连接的短信息可以包含67个字符:1072 位/(16位/字符)= 67个字符
我需要将消息的最大大小从153降低到67并使用DATA_CODING =(byte)0x08和Data.ENC_UTF16。