以下所说的是在cocos2d-x 2.2.2 或者 2.3 版本中。
首先要明白cocos2d js其实分两个版本,一个是html5的版本,另外一个是jsb的版本。虽然他们js代码一样,但是实现原理是不一样的,所以说虽然都是叫XMLHttpRequest,两个版本也是不一样的,html5的版本就是普通的ajax调用,jsb的没具体研究,jsb的可以自己修改C++代码,要完整下载cocos2d-x代码,具体位置在libJSBinding->manual->XMLHttpRequest
如何注册?
首先在项目的AppDelegate.cpp中要注册XmlHttpRequest的回调
头文件引用#include "XMLHTTPRequest.h"
在bool AppDelegate::applicationDidFinishLaunching方法中添加
sc->addRegisterCallback(MinXmlHttpRequest::_js_register);
记得如果是Android项目,切记不要忘了在AndroidManifest.XML中加入访问网络的权限,
<uses-permission android:name="android.permission.INTERNET" />
官方例子已经完全够用,可以去找下,是最后一个例子
var xhr = new XMLHttpRequest(); xhr.open("POST", "http://www.baidu.com"); xhr.onreadystatechange = function() { if (xhr.readyState==4) {// 4 = "loaded" if (xhr.status==200) {// 200 = "OK" var response = xhr.responseText;//对返回结果进行处理 } } } xhr.send("test=1");
现在我对中文乱码有了新的认识,其实并不是乱码,而是字符串的编码跟解析字符串的编码不一致导致了看起来乱七八糟的东西。只需要调整两个编码成一致的就OK了,一般都用utf-8。
我也没仔细去研究它,JS好像要显示Unicode编码,而服务器传给我的是utf-8。就导致了乱码。
有三种解决方案:
1.修改服务器的编码
2.修改cocos2d-x引擎代码 XMLHttpRequest.cpp中JS_BINDED_PROP_GET_IMPL(MinXmlHttpRequest, responseText) 方法,网络上找个c++版的utf-8转unicode方法
3.JS层找个utf-8转unicode方法。
我用了第三种方法:
function(strUtf8) { if(!strUtf8){ return; } var bstr = ""; var nTotalChars = strUtf8.length; // total chars to be processed. var nOffset = 0; // processing point on strUtf8 var nRemainingBytes = nTotalChars; // how many bytes left to be converted var nOutputPosition = 0; var iCode, iCode1, iCode2; // the value of the unicode. while (nOffset < nTotalChars) { iCode = strUtf8.charCodeAt(nOffset); if ((iCode & 0x80) == 0) // 1 byte. { if (nRemainingBytes < 1) // not enough data break; bstr += String.fromCharCode(iCode & 0x7F); nOffset++; nRemainingBytes -= 1; } else if ((iCode & 0xE0) == 0xC0) // 2 bytes { iCode1 = strUtf8.charCodeAt(nOffset + 1); if (nRemainingBytes < 2 || // not enough data (iCode1 & 0xC0) != 0x80) // invalid pattern { break; } bstr += String .fromCharCode(((iCode & 0x3F) << 6) | (iCode1 & 0x3F)); nOffset += 2; nRemainingBytes -= 2; } else if ((iCode & 0xF0) == 0xE0) // 3 bytes { iCode1 = strUtf8.charCodeAt(nOffset + 1); iCode2 = strUtf8.charCodeAt(nOffset + 2); if (nRemainingBytes < 3 || // not enough data (iCode1 & 0xC0) != 0x80 || // invalid pattern (iCode2 & 0xC0) != 0x80) { break; } bstr += String.fromCharCode(((iCode & 0x0F) << 12) | ((iCode1 & 0x3F) << 6) | (iCode2 & 0x3F)); nOffset += 3; nRemainingBytes -= 3; } else // 4 or more bytes -- unsupported break; } if (nRemainingBytes != 0) { // bad UTF8 string. return ""; } return bstr; }
参考: