让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 中的是非>>一文的思路,推测中文问题仍然是字符串的长度造成的,于是写个测试代码跟踪调试一下:

 

ContractedBlock.gif ExpandedBlockStart.gif 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,看到代码:
ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.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) 
 6ExpandedBlockStart.gifContractedBlock.gif        {
 7            int oldTop=LuaDLL.lua_gettop(luaState);
 8            if(LuaDLL.luaL_loadbuffer(luaState,chunk,"chunk")==0
 9ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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,看到代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
1LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2ExpandedBlockStart.gifContractedBlock.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,这不正是错误的原因么,

修改代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
1LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
2ExpandedBlockStart.gifContractedBlock.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带来的快感了

转载于:https://www.cnblogs.com/Red_angelX/archive/2009/04/02/1428245.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值