cocos2d js jsb XMLHttpRequest 中文乱码

1.首先讲下如何使用XMLHttpRequest


  以下所说的是在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" />


  2.XMLHttpRequest简单例子


  官方例子已经完全够用,可以去找下,是最后一个例子


  [javascript] view plaincopy在CODE上查看代码片派生到我的代码片


  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");


  3.XMLHttpRequest 中文乱码


  现在我对中文乱码有了新的认识,其实并不是乱码,而是字符串的编码跟解析字符串的编码不一致导致了看起来乱七八糟的东西。只需要调整两个编码成一致的就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方法。


  我用了第三种方法:


  [javascript] view plaincopy在CODE上查看代码片派生到我的代码片


  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;


  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值