0

我正在使用 YUI io 将数据发布到我的服务器。我在发送像æ ø å 这样的外来字符时遇到了一些问题。

第一种情况:表单发布到服务器

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

这会将表单的内容发布到服务器。如果我有一个名为“test1”的字段包含“æøå”,那么在服务器上我会看到 REQUEST_CONTENT="test1=%C3%A6%C3%B8%C3%A5"。这可以使用 urldecode 函数轻松解码,没有问题,但是......

第二种情况:数据以这种方式发布:

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.REST有一个serialize方法可以决定模型中的数据在传递给 Y.io 之前如何转换为字符串。默认情况下,它使用JSON.stringify()which 返回您所看到的内容。您可以使用 JSON 在服务器中对其进行解码。通过您的提及,urldecode我猜您正在服务器中使用 PHP。在这种情况下,您可以使用json_decodewhich 将为您提供关联数组。如果我没记错的话(我有一段时间没有使用 PHP),它应该是这样的:

$data = json_decode($HTTP_RAW_POST_DATA, true);

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

另一种选择是让您覆盖模型serialize中的方法Userserialize是一种用于ModelSync.REST在通过 IO 发送数据之前将数据转换为字符串的方法。您可以将其替换为使用querystring 模块将模型中的数据转换为常规查询字符串的方法:

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

最后,ModelSync.REST假设您将使用 JSON,因此您需要删除默认标头,以便 IO 使用纯文本。您应该在代码中的某个位置添加它:

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