Особенности кодировки при работе PHP & Ruby & Starling

В статье Ruby & PHP. Скрещиваем ужа с ежом с помощью Starling и Zend_Queue я рассказал, как организовать обмен данными между Ruby и PHP. В процессе работы возникла проблема передачи локализованных данных (на русском языке). Дальше я расскажу, как удалось её решить.

Задача

Starling работает по текстовому протоколу, информация в котором (команды и данные) кодируются в ASCII кодировке, а бинарный протокол не поддерживается. В очередь попадает массив, состоящий из текста в кодировке UTF-8, который в последствии сериализуется. Сообщение в таком виде в очередь передать уже нельзя (т.к. надо закодировать его в ASCII кодировке). Т.е. надо кодировать UTF’ые данные ASCII’шными кодами. В принципе получаем задачу свертки информации.

Решение

Для решения пробелмы можно использовать Base64-кодирование, функции работы с которыми есть и в PHP и в Ruby.  Кодирование в PHP (функцией base64_encode() ):

Раскодирование в Ruby:

Про функцию get_raw вы можете прочитать здесь.

Ссылки

Звёздные войны ASCII-видео

4 Comments

  1. Что-то мне подсказывает, что это увеличит объемы передаваемой информации и неслабо повлияет на перфоманс. Ты делал замеры?

    1. Да, увеличит.

      Результирующие закодированные по base64 данные имеют длину, большую оригинальной в соотношении 4:3

      Wiki
      Однако мой канал поддерживает передачу только ASCII символов. Ты знаешь варианты лучше?
      Тесты не делал, т.к. этот вариант кодирования показался мне оптимальным. Если будут другие – потестирую 🙂

  2. Здравствуйте. Без меня кудато нажали кнопки и при включении компа и при работе постоянно выскакивает Windows Media Center. Половина ярлыков поменялись с эмблемками виндовс и когда включаешь, например скайп, появляется Windows Media Center, а скайп не включается. Также , например, браузер Хром – появляется опять Windows Media Center. Помогите, пожалуйства. Спасибо.

Leave a Comment