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