讓LuaInterface 2.0.1支持中文

     最近也心血來潮研究Lua在.net下的運用,已有不少牛人在這方面做出了貢獻,其中可以選擇的封裝庫有LuaNet和LuaInterface,不過這2個庫都有着不支持Unicode字符(漢字)的問題-_-#..

     luanet下載地址:http://luaforge.net/projects/luanet/,最新版本Version 0.01

     luainterface下載地址:http://luaforge.net/projects/luainterface/,最新版本爲Version 2.0.3

     對比人氣感覺luainterface略高一些,版本更新多,並且還有不少工具,而luanet就顯得有點單薄了.

     關於luanet的中文支持,博客園有這麼一篇文章:<<Lua 在.net 中的是非>>,然而可能是luaforge上的庫版本有更新,調試的時候並不是在luaxlib.cpp的getS函數出錯,而是在一個NetToC_Str函數裏由於漢字的wchar>255直接返回NULL無法翻譯了.

     luainterface2.0.3暫時未放出源碼,2.0.1算個穩定版吧,下載回來,根據<<Lua 在.net 中的是非>>一文的思路,推測中文問題仍然是字符串的長度造成的,於是寫個測試代碼跟蹤調試一下:

 

Code
1            Lua lua = new Lua();
2            string xx = "function printf()\r\n io.write(string.format()) \r\n end \r\n printf('支持中文\\n') ";
3            lua.DoString(xx);
     DoString下斷點,F5,斷下,F11,看到代碼:
Code
 1        /**//*
 2         * Excutes a Lua chunk and returns all the chunk's return
 3         * values in an array
 4         */

 5        public object[] DoString(string chunk) 
 6        {
 7            int oldTop=LuaDLL.lua_gettop(luaState);
 8            if(LuaDLL.luaL_loadbuffer(luaState,chunk,"chunk")==0
 9            {
10                if (LuaDLL.lua_pcall(luaState, 0-10== 0)
11                    return translator.popValues(luaState, oldTop);
12                else
13                    ThrowExceptionFromError(oldTop);
14            }
 
15            else
16                ThrowExceptionFromError(oldTop);
17
18            return null;            // Never reached - keeps compiler happy
19        }

     因該就是這裏的luaL_loadbuffer出錯了,在F11,到了luaxlib.c,看到代碼:

 

Code
1LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2                                const char *name) {
3  LoadS ls;
4  ls.s = buff;
5  ls.size = size;
6  return lua_load(L, getS, &ls, name);
7}

     果然,也是一個ls.size=size的賦值,看看IDE提示的size的值,79,這不正是錯誤的原因麼,

修改代碼如下:

 

Code
1LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2                                const char *name) {
3  LoadS ls;
4  ls.s = buff;
5  //
6  ls.size = strlen(ls.s);
7  //ls.size = size;
8  return lua_load(L, getS, &ls, name);
9}
     重新編譯,運行,中文出來了^_^.可以慢慢享受lua和.net帶來的快感了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章