2

我目前正在尝试从 ruby​​ sinatra 服务返回 msgpack http://msgpack.org/并使用 javascript 解析它。我正在使用此处找到的 javascript 库:https ://github.com/uupaa/msgpack.js/ (尽管我认为这与这个问题无关)。

我有一个使用 msgpack gem 执行以下操作的 sinatra 服务:

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'

在服务器端。前者没有改变任何东西,但后者更接近了,除了一个例外,大部分信息都保持不变:第一个字符从转换0x820x201a.

我怀疑有一个字符集/内容类型的组合可以解决这个我还没有尝试过的问题。我也总是可以退回到 Base64,但我想先了解如何在没有 Base64 的情况下让它工作。

4

1 回答 1

1

0x82LOW QUOTATION MARKLatin1 中,0x201a与 UTF-16 中的字符相同。看看你的库如何处理编码,告诉他们使用二进制编码,不要尝试在编码之间进行任何转换。

UTF-16 有 JavaScript 的味道。如果您使用 jQuery,请查看http://blog.vjeux.com/2011/javascript/jquery-binary-ajax.html

于 2011-10-26T17:21:30.277 回答