Javascript 如何使用YUI io(XMLHttpRequest)发送外来字符

Javascript 如何使用YUI io(XMLHttpRequest)发送外来字符,javascript,character-encoding,xmlhttprequest,yui,decode,Javascript,Character Encoding,Xmlhttprequest,Yui,Decode,我正在使用YUI io将数据发布到我的服务器。我在发送像æå这样的外国角色时遇到了一些问题 第一种情况:表单被发布到服务器 Y.io(url, { method: 'POST', form: { id: 'myform', useDisabled: true } }); 这将把表单的内容发布到服务器。如果我有一个名为“test1”的字段包含“æå”,那么在服务器上我将看到REQUEST_CONTENT=“test1=%C3%A6%C3%B

我正在使用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"
});
现在我在服务器请求_CONTENT=“{”test1”:├ª├©├Ñ"}". 我怎样才能破译它?为什么会这样发送

我知道我可以在发送字符串之前使用encodeURIComponent()对字符串进行编码。但是io请求实际上是模型同步操作的一部分,所以我不直接调用io。我在做这样的事情:

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

/*
array(1) {
  ["test1"] => "æøå"
}
*/
因此,每次设置/读取属性时都进行编码/解码是没有意义的

我还尝试在请求头中设置charset=utf-8,但这并没有改变任何事情

编辑

我在chrome中进行了更多的调试,并使用以下代码行创建了请求:

transaction.c.send(data);
c是xmlhttprequest,并且(使用chrome调试器)我可以看到数据是“{”test1:“æøå”}” 当执行上述代码行时,将显示一个挂起的网络条目(在chrome调试器的“网络”选项卡下)。请求负载显示{“test1”:├ª├©├Ñ"} 标题为:

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

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

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

/*
array(1) {
  ["test1"] => "æøå"
}
*/
另一个选项是覆盖
用户
模型中的
序列化
方法
serialize
ModelSync.REST
在通过IO发送数据之前将数据转换为字符串的一种方法。您可以使用以下方法将其替换为将模型中的数据转换为常规查询字符串的方法:

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

delete Y.ModelSync.REST.HTTP_HEADERS['Content-Type'];

谢谢你的回复@juandopazo。不幸的是,我不使用php,而是使用Domino服务器。所以我没有可用的json_解码。我对第二种选择做了更多的研究。但我无法理解它。像这样使用stringify:Y.log(Y.JSON.stringify(Y.JSON.parse('{“test1”:“æå”}');不会对字符进行编码。。。也可以在问题中看到我的编辑!多米诺骨牌!我去过那里。我更新了我的答案,试图更清楚地了解
serialize
的作用。serialize似乎是做一些工作的好地方。我试试看。谢谢你的帮助。