[cocos2dx-JSB篇]sys.localStorage中文字變亂碼

文章撰寫日期︰2013/11/22 10:42
cocos2dx使用版本︰v 2.1.4

一、問題

今天在使用
sys.localStorage.setItem("mykey","我是中文");
然後使用
sys.localStorage.getItem("mykey");
欲取岀"我是中文"字串時,
Web端正常,
而Android/IOS端卻遇到了亂碼問題。

二、解決辦法

一看到上面的錯誤,
馬上就將問題點懷疑至JSB-binding身上。

在Android/IOS端若使用sys.localStorage來儲存資料,
Cocos2d-x會創建一個Native的Sqlite來儲存使用。

初步懷疑這是Sqlite的中文utf-8支援問題,
後來開啟了這個資料庫來看,
發現中文是有正常存入的。
因此問題是發生在取岀中文字串時的方法有誤

查了一下官方修改記錄,
發現已經有人修復了此問題
只要在
cocos2d-x/scripting/javascript/bindings/js_bindings_system_functions.cpp裡
添加一個include
#include "ScriptingCore.h"

並且將localStorage這個js binding code修改成底下這樣
JSBool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) {
 JSB_PRECONDITION2( argc == 1, cx, JS_FALSE, "Invalid number of arguments" );
 jsval *argvp = JS_ARGV(cx,vp);
 JSBool ok = JS_TRUE;
 const char* arg0; 

 ok &= jsval_to_charptr( cx, *argvp++, &arg0 );
 JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments");
 const char* ret_val;

 ret_val = localStorageGetItem((char*)arg0  );

// jsval ret_jsval = charptr_to_jsval( cx, ret_val);
    jsval ret_jsval = c_string_to_jsval(cx, ret_val ? ret_val : "");//加入這行
    
 JS_SET_RVAL(cx, vp, ret_jsval );

 return JS_TRUE;
}

中文亂碼問題即可解決。

這個問題官方一直到Cocos2dx3.0 alpha1才正式修復Merge進Cocos2d-x源碼中,
因此若您使用cocos2d-x2.1.4/2.1.5/3.0alpha0/3.0 alpha0,
應該都會遭遇此問題。

關鍵字︰
乱码,中文

沒有留言 :

張貼留言