下面所说的是在cocos2d-x 2.2.2 或者 2.3 版本号中。
javascript
首先要明确cocos2d js事实上分两个版本号,一个是html5的版本号,另一个是jsb的版本号。尽管他们js代码同样。但是实现原理是不同的。因此说尽管都是叫XMLHttpRequest,两个版本号也是不同的。html5的版本号就是普通的ajax调用,jsb的没详细研究。jsb的可以本身改动C++代码。要完整下载cocos2d-x代码,详细位置在libJSBinding->manual->XMLHttpRequestcss
怎样注冊?
html
首先在项目的AppDelegate.cpp中要注冊XmlHttpRequest的回调html5
头文件引用#include "XMLHTTPRequest.h"
java
在bool AppDelegate::applicationDidFinishLaunching方法中加入android
sc->addRegisterCallback(MinXmlHttpRequest::_js_register);c++
记得假设是Android项目,切记不要忘了在AndroidManifest.XML中加入訪问网络的权限,ajax
<uses-permission android:name="android.permission.INTERNET" />网络
官方样例已经全然够用,可以去找下,是最后一个样例app
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编码,而server传给个人是utf-8。就致使了乱码。
有三种解决方式:
1.改动server的编码
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; }
參考: