Бинарный возврат Синатры для msgpack - проблема кодировки / символы где-то конвертируются? - PullRequest
2 голосов
/ 26 октября 2011

В настоящее время я пытаюсь вернуть msgpack http://msgpack.org/ из службы ruby ​​sinatra и проанализировать его с помощью javascript. Я использую библиотеку javascript, найденную здесь: https://github.com/uupaa/msgpack.js/ (хотя я не думаю, что это имеет отношение к этому вопросу).

У меня есть служба sinatra, которая делает следующее с помощью gem msgpack:

require 'sinatra'
require 'msgpack'

get '/t' do
  content_type 'application/x-msgpack'
  { :status => 'success', :data => {:one => "two", :three => "four"}}.to_msgpack
end

У меня есть JavaScript, который читает его следующим образом:

<script src="js/jquery.js"></script>
<script src="js/msgpack.js"></script>
<script type="text/javascript">

    function r() {
        $.ajaxSetup({
            converters: {
                "text msgpack": function( packed ) {
                    if(packed != '') {
                        unpacked = msgpack.unpack(packed);
                        return unpacked;
                    }else{
                        return ''
                    }
                }
            }
        });

        $.ajax({
            type: "GET",
            url: "/t",
            dataType: "msgpack",
            success: function(data) {
                alert(data)
            }
        })  
    }
    $(document).ready(r)
</script>

Проблема в том, что когда я получаю данные обратно, многие символы были преобразованы из их версии на стороне сервера в 0xfffd.

Затем я попробовал два варианта:

content_type 'application/octet-stream'

и

content_type 'application/octet_stream', :charset => 'binary'

на стороне сервера. Первый ничего не изменил, но последний подошел ближе, оставив большинство сообщений нетронутыми, за одним исключением: первый символ был преобразован из 0x82 в 0x201a.

Я подозреваю, что есть комбинация типов charset / content, которая исправит это, что я еще не пробовал. Я также всегда мог вернуться к Base64, но я хотел бы понять, что нужно для того, чтобы он работал без Base64.

1 Ответ

1 голос
/ 26 октября 2011

0x82 - это LOW QUOTATION MARK на латинице 1, 0x201a - это тот же символ в UTF-16. Посмотрите, как ваши библиотеки справляются с кодировкой, скажите им использовать двоичную кодировку и не пытаться преобразовывать кодировки между ними.

UTF-16 пахнет JavaScript. Если вы используете jQuery, взгляните на http://blog.vjeux.com/2011/javascript/jquery-binary-ajax.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...