我的应用程序与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
答案 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