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