#ruby #hex #data-conversion #french #ruby-smpp
#ruby #шестнадцатеричный #преобразование данных #Французский #ruby-smpp
Вопрос:
Это связано с ruby gem ruby-smpp, который я использую для своего проекта.
У меня есть строка из байтов u0000xE0u0000xE2u0000xE1u0000xE8u0000xEAu0000xE9u0000xE7
. Оно представляет собой текст сообщения на французском языке, полученного (т.Е. MO, или с мобильного устройства). Фактическое содержание этого сообщения àâáèêéç
. Просто интересно, как преобразовать u0000xE0u0000xE2u0000xE1u0000xE8u0000xEAu0000xE9u0000xE7
в àâáèêéç
в Ruby.
Я пытался
["u0000xE0u0000xE2u0000xE1u0000xE8u0000xEAu0000xE9u0000xE7"].pack('H*')
=> "x00x02x01bnta"
и
['E0','E2','E1','E8', 'EA', 'E9', 'E7'].pack('H*')
=> "xE0"
Оба неверны.
Заранее спасибо!
Ответ №1:
Похоже, ваша строка закодирована в UTF-16BE:
str = "u0000xE0u0000xE2u0000xE1u0000xE8u0000xEAu0000xE9u0000xE7"
str.encode('UTF-8', 'UTF-16BE')
#=> "àâáèêéç"
Комментарии:
1. Что подсказывает вам, что это кодировка UTF-16BE (от кого-то, кто ничего не смыслит в кодировке)?
2. @CarySwoveland (1) потому что значения выглядели как слова (0x00E0, 0x00E2, …), то есть 16-разрядные значения, и (2) потому что 0xE0 (224) является кодовой точкой для
à
в Unicode.3. Я вижу, что есть способ ленивого человека ответить на мой вопрос:
Encoding.list.find { |e| str.encode('UTF-8', e) == "àâáèêéç" rescue nil } #=> #<Encoding:UTF-16BE>
. Смотрите Кодировку#list . Примечание:Encoding.list.size #=> 101
.4. @CarySwoveland Я знаю этот способ… быстрее, проще, соблазнительнее 🙂