我目前正在尝试从 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'
在服务器端。前者没有改变任何东西,但后者更接近了,除了一个例外,大部分信息都保持不变:第一个字符从转换0x82
为0x201a
.
我怀疑有一个字符集/内容类型的组合可以解决这个我还没有尝试过的问题。我也总是可以退回到 Base64,但我想先了解如何在没有 Base64 的情况下让它工作。