文章撰寫日期︰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,
應該都會遭遇此問題。
關鍵字︰
乱码,中文


沒有留言 :
張貼留言