cocos2d js jsb XMLHttpRequest 中文乱码

1.首先讲下怎样使用XMLHttpRequest

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


2.XMLHttpRequest简单样例


官方样例已经全然够用,可以去找下,是最后一个样例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");


3.XMLHttpRequest 中文乱码

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


參考:

cocos2d js jsb XMLHttpRequest