无法在多个短信中使用Open-Smpp库发送特殊字符

问题描述 投票:0回答:1

我正在使用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 =(字节)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);
    }
}
java smpp
1个回答
1
投票

我使用来自这个URL的信息找到了解决方案。 这是简短的解释:

GSM字符编码使用7位来表示每个字符,非基于拉丁语的字母表语言通常使用支持Unicode的电话。这些电话使用的特定字符编码通常是UTF-16或UCS-2。 UTF-16和UCS-2都使用16位来表示每个字符。标准SMS消息的最大有效载荷为140字节(1120位)。对于使用16位字符编码的Unicode电话,每个标准SMS消息最多允许70个字符。 UDH占用正常SMS消息有效载荷的6个字节(48位)。因此,每个单独连接的SMS消息可以包含67个字符:1072位/(16位/字符)= 67个字符

我需要将消息的最大大小从153降低到67并使用DATA_CODING =(byte)0x08和Data.ENC_UTF16。

© www.soinside.com 2019 - 2024. All rights reserved.