最近也心血来潮研究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![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
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![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
7
int oldTop=LuaDLL.lua_gettop(luaState);
8
if(LuaDLL.luaL_loadbuffer(luaState,chunk,"chunk")==0)
9![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
10
if (LuaDLL.lua_pcall(luaState, 0, -1, 0) == 0)
11
return translator.popValues(luaState, oldTop);
12
else
13
ThrowExceptionFromError(oldTop);
14
}
15
else
16
ThrowExceptionFromError(oldTop);
17![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
return null; // Never reached - keeps compiler happy
19
}
因该就是这里的luaL_loadbuffer出错了,在F11,到了luaxlib.c,看到代码:
Code
1
LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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
1
LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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带来的快感了