【问题标题】:Sinatra binary return for msgpack -- charset issue/ characters being converted somewhere?msgpack 的 Sinatra 二进制返回——字符集问题/字符在某处被转换?
【发布时间】: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


【解决方案1】:

0x82 在 Latin1 中是 LOW QUOTATION MARK0x201a 在 UTF-16 中是同一个字符。看看你的库是如何处理编码的,告诉他们使用二进制编码,不要尝试在编码之间进行任何转换。

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

【讨论】:

  • 所以现在我只是想让它在没有 JQuery 的情况下工作(使用您发送的链接以及 developer.mozilla.org/En/XMLHttpRequest/…)。但是,我越深入研究,最好的解决方案似乎就是转换为 Base64,这样浏览器兼容性问题就会减少……我处于相对陌生的领域,所以我相信它也会更易于维护。 -- 感谢您的帮助!
  • 实际上真正的问题是很少有库开发人员熟悉这个问题。这些天,编码咬了很多。 :)
  • Sinatra 没有触及 body 的编码。
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 2023-03-02
  • 2021-05-09
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多