奇怪的 unicode 崩溃

Strange unicode crash

我的一个 Rails 应用程序从一个 ATT 号码收到了四条短信,每条短信的开头是(按顺序):

\u0005\u0000\u0003?\u0004\u0001 Message 1...

\u0005\u0000\u0003?\u0004\u0002 Message 2...

\u0005\u0000\u0003?\u0004\u0003 Message 3...

\u0005\u0000\u0003?\u0004\u0004 Message 4...

应用程序每次都崩溃并出现错误 "string contains null byte"。

它们似乎无法解码为我认识的任何 unicode。有人以前看过这个吗?

快速谷歌搜索("SMS header," 也许是一个幸运的猜测)显示这是一个 SMS 用户数据 Header (UDH);特别是描述 "Concatenated SMS" (CSMS) 的消息,即被拆分为多条消息的长消息。维基百科有一个很好的概述:https://en.wikipedia.org/wiki/Concatenated_SMS那里描述的八位字节与您所看到的完全匹配:

  1. 05:用户数据的长度Header,在本例中为 5.
  2. 00:信息元素标识符; 00 是串联 SMS 的标识符。
  3. 03:header不包括前两个字段的长度(我认为这是多个header可以一个接一个地使用,在这种情况下第一个八位字节将是所有 header 的总长度)。
  4. 3F:CSMS标识符,即所有消息部分共享的ID。 (Ruby 将其显示为 ? 因为 0+003F 恰好是问号的 UTF-8 代码点。)
  5. 04:零件总数。
  6. 00-FF: 这部分在序列中的编号。

我推荐阅读维基百科文章;它很容易理解,而且我确定我把一些事情简单化了。

利用此 header 将 CSMS 部件重新组合在一起将是一个有趣的问题。不过,令我感到惊讶的是,无论您使用什么 API 都不会为您做到这一点。