Преобразование Ruby hex в строку с использованием французских символов

#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 Я знаю этот способ… быстрее, проще, соблазнительнее 🙂