Ruby如何从smsc转换回二进制字符串

时间:2016-08-01 13:49:57

标签: ruby-on-rails ruby encoding utf-8

我的应用程序与SMSC一起工作,我需要在发送之前参与短信,

我尝试从手机发送该字符串

  

"你好,这是测试"

当我检查smsc时,我将其作为文本的二进制字符串:

userData = "c8329bfd06d1d1e939283d07d1cb733a"

此字符串的编码为:

<Encoding:ASCII-8BIT>

我知道这个userData可能是二进制字符串中的GSM编码

那么如何从userData获取明文字符串呢?

这个问题是针对英语的,因为在希伯来语中我可以回来了 使用此代码的字符串:

[userData].pack('H*').force_encoding('utf-16be').encode('utf-8')

但是在英语中我得到了错误:

Encoding::InvalidByteSequenceError: "\xDA\xF3" followed by "u" on UTF-16BE

我尝试的是用ICU检测二进制字符串,我得到了:

&#34; ISO-8859-1&#34;检测到的语言是:&#39; PT&#39;,这很奇怪,因为我的语言是英语或希伯来语。

无论如何我迷失了编码的东西,所以我尝试编码来自Encoding.list

的每个列表名称

但直到现在没有运气

提前致谢

Shmulik

1 个答案:

答案 0 :(得分:0)

好的,

对于那些也有这个问题的人,我得到了解决方案,感谢来自#ruby irc社区的人(我错过了他的昵称)

解决方案是:

表示插入二进制的 ascii 字符:

你需要:

"c8329bfd06d1d1e939283d07d1cb733a".scan(/../).reverse_each.map { |h| h.to_i(16) }.pack('C*').unpack('B*')[0][2..-1].scan(/.{7}/).map.with_object("") { |x, s| s << x.to_i(2) }.reverse

记得我用短信发了这个词:

  

“你好,这是测试”

它已成为二进制文件:

  

“c8329bfd06d1d1e939283d07d1cb733a”

我在任何编码中得到垃圾的原因是,因为ascii字符是7位GSM,所以只有前7位表示数据,但每个编码使用至少8位,所以代码实际上做了什么。

但这仅适用于 ascii 字符集。

在另一种语言中,例如我使用希伯来语,短信发送为 ucs2

所以这段代码对我有用:

[your_binary_string].pack('H*').force_encoding('utf-16be').encode('utf-8')

将二进制字符串放在数组中非常重要

所以现在都是。

如果有人想翻译并解释ascii char set代码中究竟发生了什么,请成为我的客人和欢迎。

Shmulik