关于javascript:在PDU模式下支持[和]字符

Support [ and ] characters in PDU mode

我正在Nodejs中编写应用程序,用于在PDU模式下发送和接收短信息。我使用WaveCom GSM调制解调器(7位编码)发送短信息。它还支持8位(at+csmp=1167,0,8)编码方案。

我可以正确地发送字母数字字符,但不能发送像([,],等)这样的字符。

这里的字符串:

1
2
AT+CMGS=14    
0001030C911989890878800004015B

文本字符串:[

但我收到一些垃圾角色。有什么想法吗?

以及如何发送多部分短信。我已经提到了这个,但是我没有得到想要的输出。有人能推荐8位(7位编码方案)文本编码方案吗?请帮帮我…


根据此页面(参见发送Unicode短信部分),8位编码实际上是UCS-2。

我对nodejs不太了解,无法为您提供完整的实现,但这里有一个.NET示例:

1
2
3
4
5
6
7
8
9
10
string EncodeSmsText(string text)
{
    // Convert input string to a sequence of bytes in BigEndian UCS-2 encoding
    //    'Hi' -> [0, 72, 0, 105]
    var bytes = Encoding.BigEndianUnicode.GetBytes(text);

    // Encode bytes to hex representation
    //    [0, 72, 0, 105] -> '00480069'
    return BitConverter.ToString(bytes).Replace("-","");
}

请注意,根据本文,我的代码不适用于编码为代理项对的字符,因为Encoding.BigEndianEncoding是utf-16(不是ucs-2)。

编辑

以下是在缓冲区类中使用内置ucs2转换器的nodejs版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function swapBytes(buffer) {
    var l = buffer.length;
    if (l & 0x01) {
        throw new Error('Buffer length must be even');
    }
    for (var i = 0; i < l; i += 2) {
        var a = buffer[i];
        buffer[i] = buffer[i+1];
        buffer[i+1] = a;
    }
    return buffer;
}

function encodeSmsText(input) {
    var ucs2le = new Buffer(input, 'ucs2');
    var ucs2be = swapBytes(ucs2le);
    return ucs2be.toString('hex');

}

console.log(encodeSmsText('Hi'));

受到这些答案的启发:

  • 节点.js big endian ucs-2
  • 如何在node.js中进行base64编码?


谢谢,

最后我得到了答案:)

此字符([,],)编码为以下两个字符:

[编码为1B1E(转义符和<号的组合)

]编码为1B20(ESCAP字符和>符号的组合)

所以每当我喜欢这样的字符,我就用相应的值替换它,然后使用7位编码。工作很好…

所以我的编码字符串是

1
2
> AT+CMGS=15
> 0001000C911989890878800000021B1E

对于"[你好]"

1
2
> AT+CMGS=21
> 0001000C911989890878800000091B1EBACC66BF373E

再次感谢……