Javascript msgpack的Sinatra二进制返回——字符集问题/字符在某处转换?
我目前正在尝试从ruby sinatra服务返回msgpack,并使用javascript对其进行解析。我正在使用这里找到的javascript库:(尽管我认为这与这个问题无关) 我有一个sinatra服务,它使用msgpack gem执行以下操作: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 =
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'