javascript - How can I send foreign characters with YUI io (XMLHttpRequest) -


i'm using yui io post data server. have problems sending foreign characters æ ø å.

first case: form posted server

y.io(url, {     method: 'post',     form: {         id: 'myform',         usedisabled: true     } }); 

this post content of form server. if have field named "test1" containing "æøå", on server i'll see request_content="test1=%c3%a6%c3%b8%c3%a5". can decode urldecode function, no problem, but...

second case: data posted way:

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

now see on server request_content="{"test1":"├ª├©├Ñ"}". how can decode that? , why send that?

i know can use encodeuricomponent() encode string before sending it. io request part of model sync operation, i'm not calling io directly. i'm doing this:

y.user = y.base.create('user', y.model, [y.modelsync.rest], {....}); var user = new y.user(); user.set('test1', 'æøå'); user.save(); 

so doesn't make sense encode/decode everytime set/read attribute.

also have tried set charset=utf-8 in request header, didn't change anything.

edit

i have done more debugging in chrome , request created line of code:

transaction.c.send(data); 

transaction.c xmlhttprequest , (using chrome debugger) can see data "{"test1":"æøå"}" when above line of code executed, pending network entry shown (under network tab in chrome debugger). request payload displays {"test1":"├ª├©├Ñ"} headers are:

accept:application/json content-type:application/json; charset=utf-8 

modelsync.rest has serialize method decides how data in model turned string before passing y.io. default uses json.stringify() returns you're seeing. can decode in server using json. mention of urldecode guess you're using php in server. in case can use json_decode give associative array. if i'm not mistaken (i haven't used php in while), should go this:

$data = json_decode($http_raw_post_data, true);  /* array(1) {   ["test1"] => "æøå" } */ 

another option override serialize method in user model. serialize method used modelsync.rest turn data string before sending through io. can replace method turns data in model regular query string using the querystring module:

y.user = y.base.create('user', y.model, [y.modelsync.rest], {   serialize: function () {     return y.querystring.stringify(this.tojson());   } }); 

finally, modelsync.rest assumes you'll using json need delete default header io uses plain text. should add @ point in code:

delete y.modelsync.rest.http_headers['content-type']; 

Comments