【问题标题】:Send SMS containting Emojis with AT Commands使用 AT 命令发送包含表情符号的短信
【发布时间】:2019-11-20 16:36:22
【问题描述】:

我想使用 AT 命令从我的 GSM 调制解调器发送包含表情符号的短信。

但是,无论我尝试哪种编码,它都无法正常工作(Encoding.BigEndianUnicodeEncoding.UnicodeDefault)使 SMS 无法读取。

我的代码看起来有点像这样:

// [..]
// send message with UCS2
command = "AT+CSCS=\"UCS2\"" + char.ConvertFromUtf32(13);
send(command);   

// [..]
// convert my message (string from a WPF TextBox) to a unicode hex-string
byte[] ba = Encoding.BigEndianUnicode.GetBytes(message);
var hexString = BitConverter.ToString(ba);
hexString = hexString.Replace("-", "");

// send the converted string
command = hexString  + char.ConvertFromUtf32(26);
send(command);
// [..]

短信成功到达目的地,但短信只是一些不可读的东西

这甚至可能吗?我的 GSM 调制解调器也支持“HEX”作为编码。

更新: 如果我替换这一行,它有点工作:

command = hexString  + char.ConvertFromUtf32(26);

有了这个:

command = "80 " + hexString + char.ConvertFromUtf32(26);

但是我在消息的开头收到了这个㣩字母......

【问题讨论】:

  • UCS-2 无法对基本平面之外的字符进行编码,例如表情符号。请编辑您的问题以演示/验证将 "\N{NAUSEATED FACE}" (U+1F922) 编码为 UTF-16BE 会导致八位字节 0xd8 0x3e 0xdd 0x22 并且没有字节顺序标记。

标签: c# unicode encoding at-command


【解决方案1】:

确保您的调制解调器使用正确的 SMS 数据编码方案。请参阅this answer

  1. 使用AT+CMGF=1将调制解调器设置为文本模式
  2. 使用AT+CSCS="UCS2" 将编码方案设置为"UCS2"
  3. AT+CSMP=1,167,0,8 发送到调制解调器。
  4. 现在在 UCS2 模式下,调制解调器也需要 UCS2 形式的收件人号码,即+123456890 发送 AT+CGMS="002B003100320033003400350036003800390030",145(145 是带有国家代码的号码的地址类型,否则使用 129
  5. 调制解调器应以> 提示响应。然后,以正确的编码发送消息,即按照我将描述为 UCS2/UTF-16 字节的 ASCII 十六进制序列发送消息,即将字符串编码为 UTF-16BE,然后将每个字节格式化为 ASCII HEX字符,即U+1F408的?变成发送到调制解调器的D83DDC08012ABC变成003000310032 004100420043

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多