Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript msgpack的Sinatra二进制返回——字符集问题/字符在某处转换?_Javascript_Ruby_Character Encoding_Sinatra_Msgpack - Fatal编程技术网

Javascript msgpack的Sinatra二进制返回——字符集问题/字符在某处转换?

Javascript msgpack的Sinatra二进制返回——字符集问题/字符在某处转换?,javascript,ruby,character-encoding,sinatra,msgpack,Javascript,Ruby,Character Encoding,Sinatra,Msgpack,我目前正在尝试从ruby sinatra服务返回msgpack,并使用javascript对其进行解析。我正在使用这里找到的javascript库:(尽管我认为这与这个问题无关) 我有一个sinatra服务,它使用msgpack gem执行以下操作: require 'sinatra' require 'msgpack' get '/t' do content_type 'application/x-msgpack' { :status => 'success', :data =

我目前正在尝试从ruby sinatra服务返回msgpack,并使用javascript对其进行解析。我正在使用这里找到的javascript库:(尽管我认为这与这个问题无关)

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

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>

在服务器端。前者没有改变任何东西,但后者更接近了,除了一个例外,大部分消息都没有被触及:第一个字符从
0x82
转换为
0x201a


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

0x82
是拉丁文中的
低引号,
0x201a
是UTF-16中的同一个字符。看看您的库如何处理编码,告诉它们使用二进制编码,不要尝试编码之间的任何转换


UTF-16有JavaScript的味道。如果您使用jQuery,请查看。

您正在运行哪个版本的Ruby?Ruby 1.9.2p290(2011-07-09修订版32553)[i686 linux]——在ubuntu 10.10 64位上。此外,我正在使用Sinatra 1.2.6,Rack 1.3.2使用瘦1.2.11托管。也就是说,我只是尝试使用net http获得响应——似乎转换没有发生在服务器端。我更新了答案以反映这一点。因此,现在我只是尝试在不使用JQuery的情况下使其工作(使用您发送的链接以及其他链接)。然而,我越是深入研究这个问题,最好的解决方案似乎就是转换成Base64,这样浏览器兼容性问题就越少。。。我在一个相对陌生的领域,所以我相信它也会更容易维护谢谢你的帮助!实际上,真正的问题是很少有库开发人员熟悉这个问题。这些天来,编码非常有用。:)Sinatra不接触身体的编码。
content_type 'application/octet-stream'
content_type 'application/octet_stream', :charset => 'binary'