【发布时间】:2011-10-26 17:10:52
【问题描述】:
我目前正在尝试从 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 的情况下让它工作。
【问题讨论】:
-
你运行的是哪个版本的 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 获得响应 - 转换似乎没有发生在服务器端。
-
我更新了答案以反映这一点。
标签: javascript ruby character-encoding sinatra msgpack