【问题标题】:Can't send special characters using Open-Smpp library in multi sms无法在多短信中使用 Open-Smpp 库发送特殊字符
【发布时间】:2018-02-27 23:12:46
【问题描述】:

我正在使用 open-smpp 库与 SMSC 进行通信。 我可以发送单条和多条短信,但是我遇到了特殊字符(šđžć)的问题,如果发送多条消息(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 =(字节)0x01 和 Data.ENC_UTF16
DATA_CODING =(字节)0x08 和 Data.ENC_UTF16
DATA_CODING =(字节)0x01 和 Data.ENC_UTF8
DATA_CODING =(字节)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);
    }
}

【问题讨论】:

  • 您似乎遇到了编码问题。确保使用 utf8 对所有内容进行编码/解码...
  • 我尝试了所有组合都没有成功,对我来说奇怪的是相同的编码适用于发送单条消息(sendSMS)而不适用于多条消息(sendMultiSMS)。
  • 我知道伙计,编码问题是最令人沮丧的,没有简单的方法来解决它,可能是smpp中的一个错误。你试过使用不同的版本吗?
  • 我在这里问,但它被标记为重复enter link description here

标签: java smpp


【解决方案1】:

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

GSM 字符编码使用 7 位来表示每个字符, 非拉丁字母语言通常使用支持 统一码。这些电话使用的特定字符编码是 通常是 UTF-16 或 UCS-2。 UTF-16 和 UCS-2 都使用 16 位 代表每个字符。标准 SMS 消息具有最大有效负载 140 字节(1120 位)。对于使用 16 位的 Unicode 电话 字符编码,这允许每个最多 70 个字符 标准短信。 UDH 占用普通短信的 6 个字节(48 位) 消息有效载荷。所以 每条连接的 SMS 消息可以容纳 67 个字符:1072 位/(16 位/字符)= 67 个字符

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多