2

現在、ルビー シナトラ サービスから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.

次に、2 つのバリアントを試しました。

content_type 'application/octet-stream'

content_type 'application/octet_stream', :charset => 'binary'

サーバー側で。前者は何も変更しませんでしたが、後者は近づき、1 つの例外を除いてほとんどのメッセージは変更されませんでした: 最初の文字が から に変換され0x82ました0x201a

まだ試していない、これを修正する文字セット/コンテンツタイプの組み合わせがあると思います。いつでも Base64 にフォールバックすることもできますが、最初に Base64 なしで機能させるには何が必要かを理解したいと思います。

4

1 に答える 1

1

0x82LOW QUOTATION MARKLatin1 で、0x201aUTF-16 では同じ文字です。ライブラリがエンコーディングをどのように扱っているかを見て、バイナリエンコーディングを使用し、エンコーディング間の変換を試みないように指示してください。

UTF-16 は JavaScript のにおいがします。jQuery を使用している場合は、http://blog.vjeux.com/2011/javascript/jquery-binary-ajax.html をご覧ください。

于 2011-10-26T17:21:30.277 に答える