Особенности кодировки при работе PHP & Ruby & Starling
В статье Ruby & PHP. Скрещиваем ужа с ежом с помощью Starling и Zend_Queue я рассказал, как организовать обмен данными между Ruby и PHP. В процессе работы возникла проблема передачи локализованных данных (на русском языке). Дальше я расскажу, как удалось её решить.
Задача
Starling работает по текстовому протоколу, информация в котором (команды и данные) кодируются в ASCII кодировке, а бинарный протокол не поддерживается. В очередь попадает массив, состоящий из текста в кодировке UTF-8, который в последствии сериализуется. Сообщение в таком виде в очередь передать уже нельзя (т.к. надо закодировать его в ASCII кодировке). Т.е. надо кодировать UTF’ые данные ASCII’шными кодами. В принципе получаем задачу свертки информации.
Решение
Для решения пробелмы можно использовать Base64-кодирование, функции работы с которыми есть и в PHP и в Ruby. Кодирование в PHP (функцией base64_encode() ):
|
1 2 |
$queuePool = new Zend_Queue(new ZendExtra_Queue_Adapter_Starling(array()), array('name' => 'my_queue')); $queuePool->send(array('data' => base64_encode('текст на русском'), 'action' => 'some_action')); |
Раскодирование в Ruby:
|
1 2 3 4 5 6 7 |
require 'starling' require 'base64' loop do begin job = starling.get_raw('my_queue') puts Base64.encode64(job['data']) end |
Про функцию get_raw вы можете прочитать здесь.
