Ruby 涉及法语字符的十六进制到字符串的转换
Ruby hex to string conversion involving French characters
这与我在我的项目中使用的 ruby gem ruby-smpp 有关。
我有一串字节\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7
。它代表收到的法语消息正文(即 MO,或移动发起的)消息。这条消息的实际内容是àâáèêéç
。只是想知道如何在 Ruby 中将 \u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7
转换为 àâáèêéç
。
我试过了
["\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7"].pack('H*')
=> "\x00\x02\x01\b\n\t\a"
和
['E0','E2','E1','E8', 'EA', 'E9', 'E7'].pack('H*')
=> "\xE0"
两者都错了。
提前致谢!
看起来你的字符串是 UTF-16BE 编码的:
str = "\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7"
str.encode('UTF-8', 'UTF-16BE')
#=> "àâáèêéç"
这与我在我的项目中使用的 ruby gem ruby-smpp 有关。
我有一串字节\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7
。它代表收到的法语消息正文(即 MO,或移动发起的)消息。这条消息的实际内容是àâáèêéç
。只是想知道如何在 Ruby 中将 \u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7
转换为 àâáèêéç
。
我试过了
["\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7"].pack('H*')
=> "\x00\x02\x01\b\n\t\a"
和
['E0','E2','E1','E8', 'EA', 'E9', 'E7'].pack('H*')
=> "\xE0"
两者都错了。
提前致谢!
看起来你的字符串是 UTF-16BE 编码的:
str = "\u0000\xE0\u0000\xE2\u0000\xE1\u0000\xE8\u0000\xEA\u0000\xE9\u0000\xE7"
str.encode('UTF-8', 'UTF-16BE')
#=> "àâáèêéç"