0

YUI io を使用してサーバーにデータを投稿しています。æ ø å などの外国語の文字の送信に問題があります。

最初のケース: フォームがサーバーに投稿される

Y.io(url, {
    method: 'POST',
    form: {
        id: 'myform',
        useDisabled: true
    }
});

これにより、フォームのコンテンツがサーバーにポストされます。「æøå」を含む「test1」という名前のフィールドがある場合、サーバーには REQUEST_CONTENT="test1=%C3%A6%C3%B8%C3%A5" が表示されます。これは urldecode 関数で簡単にデコードできますが、問題はありません...

2 番目のケース: データは次のように投稿されます。

Y.io(uri, {
    data   : '{"test1":"æøå"}'),
    method : "POST"
});

これは、サーバー REQUEST_CONTENT="{"test1":"├ª├©├Ñ"}" で確認できます。どうすればそれをデコードできますか?そして、なぜそのように送信されるのですか?

encodeURIComponent() を使用して、文字列を送信する前にエンコードできることはわかっています。しかし、io リクエストは実際には Model Sync 操作の一部であるため、直接 io を呼び出していません。私はこのようなことをしています:

Y.User = Y.Base.create('user', Y.Model, [Y.ModelSync.REST], {....});
var user = new Y.User();
user.set('test1', 'æøå');
user.save();

したがって、属性を設定/読み取るたびにエンコード/デコードするのは意味がありません。

また、リクエストヘッダーに charset=utf-8 を設定しようとしましたが、何も変わりませんでした。

編集

Chrome でさらにデバッグを行ったところ、次のコード行でリクエストが作成されました。

transaction.c.send(data);

transaction.c は xmlhttprequest であり、(chrome デバッガーを使用して) データが "{"test1":"æøå"}" であることを確認できます。上記のコード行が実行されると、保留中のネットワーク エントリが表示されます (ネットワーク タブの下)。クロームデバッガー)。リクエストのペイロードは {"test1":"├ª├©├Ñ"} と表示されます。ヘッダーは次のとおりです。

Accept:application/json
Content-Type:application/json; charset=UTF-8
4

1 に答える 1

0

ModelSync.RESTserializeモデル内のデータを Y.io に渡す前に文字列に変換する方法を決定するメソッドがあります。デフォルトではJSON.stringify()、表示されているものを返す which を使用します。JSONを使用してサーバーでデコードできます。あなたの言及によりurldecode、サーバーでPHPを使用していると思います。その場合json_decode、連想配列を提供する which を使用できます。私が間違っていなければ (私はしばらく PHP を使用していません)、次のようになります。

$data = json_decode($HTTP_RAW_POST_DATA, true);

/*
array(1) {
  ["test1"] => "æøå"
}
*/

別のオプションは、モデルのserializeメソッドをオーバーライドすることです。は、データを IO 経由で送信する前に文字列に変換するために使用されるメソッドです。querystring モジュールを使用して、モデル内のデータを通常のクエリ文字列に変換するメソッドに置き換えることができます。UserserializeModelSync.REST

Y.User = Y.Base.create('user', Y.Model, [Y.ModelSync.REST], {
  serialize: function () {
    return Y.QueryString.stringify(this.toJSON());
  }
});

最後に、ModelSync.RESTJSON を使用することを想定しているため、IO がプレーン テキストを使用するようにデフォルトのヘッダーを削除する必要があります。コードのある時点でこれを追加する必要があります。

delete Y.ModelSync.REST.HTTP_HEADERS['Content-Type'];
于 2013-07-11T14:29:02.453 に答える