您好,欢迎访问一九零五行业门户网

No2:luacom中文内容输出BUG及修正

使 用cell.value2输出中文内容时总是乱码。怀疑是utf-8的原因,转换后结果仍然是乱码。自己再写个转换的再测试,依然是乱码,莫非有bug!? 下个luacom的源码,查看函数 tluacomtypehandler::com2lua 和 tstringbuffer tutil::bstr2string 。整个过程看起来
    使用cell.value2输出中文内容时总是乱码。怀疑是utf-8的原因,转换后结果仍然是乱码。自己再写个转换的再测试,依然是乱码,莫非有bug!?
下个luacom的源码,查看函数tluacomtypehandler::com2lua和tstringbuffer tutil::bstr2string。整个过程看起来都ok,但再测试发现,结果字符串少了一个bytes。
    在tluacomtypehandler::com2luavt_bstr分支中返回结果恰好是减去1,将其修改
lua_pushlstring(l, str, str.getsize()-1);修改为lua_pushlstring(l, str, str.getsize());
    重新编译luacom,再看cell.value2输出结果,终于正确了。由于没进行全面测试,不知道其此修改会不会引入错误。资源里有个已经编译好的。
--lc是从网上抄来的unicode utf-8 ansi相互转换的函数
package.cpath=[[c:\program files\lua\5.1\clibs\?.dll;d:\loonlib\sample\lc\?.dll]]require luacomrequire lcfunction print_table(t) for k,v in pairs(t) do print(k,v) end endexcel = luacom.createobject(excel.application)excel.visible = trueexcel.workbooks:add();--luacom.viewtypelib(excel);sheet=excel.sheets(1);local r=sheet:range(e6);local s = 严中;ws, s2=lc.a2w(s); --0x25 0x4e 0x2d 0x4e 0x00 0x00 6print(unicode : .. lc.bstr(ws, s2));us, s2=lc.w2u(ws, s2); --0xe4 0xb8 0xa5 0xe4 0xb8 0xad 0x00 0x00 8print(utf8 : .. lc.bstr(us, s2));r.value2=us;ws, s2=lc.u2w(r.value2, s2);print(unicode : .. lc.bstr(ws, s2));as, s2=lc.w2a(ws, s2);print(ansi : .. lc.bstr(as, s2));print(as);
lc.def
library lcexports luaopen_lc
lc.h
extern c {#include lua.h#include lualib.h #include lauxlib.hint luaopen_local(lua_state* l);}#include #include #ifdef win32#include #include #else#include #endif#define ln_lc lcint lua_a2w(lua_state* l);int lua_u2w(lua_state* l);int lua_w2a(lua_state* l);int lua_w2u(lua_state* l);int lua_u2a(lua_state* l);int lua_a2u(lua_state* l);int lua_bstr(lua_state* l);int lua_help(lua_state* l);wchar_t* mb2wc(const char* mbstr, int& s2, int cp);char* wc2mb(const wchar_t* wcstr, int& s2, int cp);
lc.cpp
#include lc.h//g++ -shared -s -o lc.dll -o3 lc.cpp lc.def -llua5.1 -dwin32 -i%loon%/lua/src -l%loon%/lib/gcc_dll/debug -wl,--out-implib,liblc.a int lua_bstr(lua_state* l) { const char* s = lual_optstring(l, 1, ); int len = lual_optnumber(l, 2, 0); if (strcmp(s, )==0 || 0==len) { lua_pushstring(l, s); } else { lual_buffer b; lual_buffinit(l, &b); char* byte = (char*)malloc(64); for (int i=0; i0) { int s2 = 0; wchar_t* wcstr = mb2wc(mbstr, s2, cp_utf8); if (wcstr) { lua_pushlstring(l, (const char*)wcstr, s2); lua_pushnumber(l, s2); delete[] wcstr; result = 2; } } return result;}int lua_a2w(lua_state* l) { int result = 0; size_t len = 0; const char* mbstr = lua_tolstring(l, 1, &len); if (mbstr && len>0) { int s2 = 0; wchar_t* wcstr = mb2wc(mbstr, s2, cp_acp); if (wcstr) { lua_pushlstring(l, (const char*)wcstr, s2); lua_pushnumber(l, s2); delete[] wcstr; result = 2; } } return result;}int lua_w2a(lua_state* l) { int result = 0; size_t len = 0; const char* wcstr = lua_tolstring(l, 1, &len); if (wcstr && len>0) { int s2 = 0; char* mbstr = wc2mb((wchar_t*)wcstr, s2, cp_acp); if (mbstr) { lua_pushlstring(l, mbstr, s2); lua_pushnumber(l, s2); delete[] mbstr; result = 2; } } return result;}int lua_w2u(lua_state* l) { int result = 0; size_t len = 0; const char* wcstr = lua_tolstring(l, 1, &len); if (wcstr && len>0) { int s2 = 0; char* mbstr = wc2mb((wchar_t*)wcstr, s2, cp_utf8); if (mbstr) { lua_pushlstring(l, mbstr, s2); lua_pushnumber(l, s2); delete[] mbstr; result = 2; } } return result;}int lua_u2a(lua_state* l) { int result = 0; size_t len = 0; const char* mbstr = lua_tolstring(l, 1, &len); if (mbstr && len>0) { int s2 = 0; wchar_t* wcstr = mb2wc(mbstr, s2, cp_utf8); if (wcstr) { char* nmbstr = wc2mb(wcstr, s2, cp_acp); if (nmbstr) { lua_pushlstring(l, nmbstr, s2); lua_pushnumber(l, s2); result = 2; delete[] nmbstr; } delete[] wcstr; } } return result;}int lua_a2u(lua_state* l) { int result = 0; size_t len = 0; const char* mbstr = lua_tolstring(l, 1, &len); if (mbstr && len>0) { int s2 = 0; wchar_t* wcstr = mb2wc(mbstr, s2, cp_acp); if (wcstr) { char* nmbstr = wc2mb(wcstr, s2, cp_utf8); if (nmbstr) { lua_pushlstring(l, nmbstr, s2); lua_pushnumber(l, s2); result = 2; delete[] nmbstr; } delete[] wcstr; } } return result;}wchar_t* mb2wc(const char* mbstr, int& s2, int cp) { wchar_t* wcstr = null;#ifdef win32 int size = multibytetowidechar(cp, 0, mbstr, -1, null, 0);#else size_t size = mbstowcs(null, mbstr, 0);#endif wcstr = new wchar_t[size]; if (wcstr) { memset(wcstr, 0, size * sizeof(wchar_t));#ifdef win32 int ret = multibytetowidechar(cp, 0, mbstr, -1, wcstr, size); if (ret == 0) { // multibytetowidechar returns 0 if it does not succeed.#else size_t ret = mbstowcs(wcstr, mbstr, size+1); if (ret == -1) {#endif delete[] wcstr; wcstr = null; } s2 = 2*size; } return wcstr;}char* wc2mb(const wchar_t* wcstr, int& s2, int cp) { char* mbstr = null;#ifdef win32 int size = widechartomultibyte(cp, 0, wcstr, -1, null, 0, null, null);#else size_t size = wcstombs(null, wcstr, 0);#endif mbstr = new char[size]; if (mbstr) { memset(mbstr, 0, size * sizeof(char));#ifdef win32 int ret = widechartomultibyte(cp, 0, wcstr, -1, mbstr, size, null, null); if (ret == 0) { // multibytetowidechar returns 0 if it does not succeed.#else size_t ret = wcstombs(mbstr, wcstr, size+1); if (ret == -1) {#endif delete[] mbstr; mbstr = null; } s2 = size; } return mbstr;}int lua_help(lua_state* l) { const char* s= simple characters transformation\n a2w(ansi to unicode)\n u2w(utf8 to unicode)\n w2a(unicode to ansi)\n w2u(unicode to utf8)\n u2a(utf8 to ansi)\n a2u(ansi to utf8)\n bstr(bytes of str)\n help(show this)\n\n example :\n local s = \i like lua\\n print(lc.bstr(s, string.len(s)+1))\n local ws, s2 = lc.a2w(s)\n wunoman@qq.com 2012/03/06\n ; lua_pushstring(l, s); return 1;}lual_reg lrg_lc[] = { {a2w, lua_a2w}, {u2w, lua_u2w}, {w2a, lua_w2a}, {w2u, lua_w2u}, {u2a, lua_u2a}, {a2u, lua_a2u}, {bstr, lua_bstr}, {help, lua_help}, {null, null}};extern c int luaopen_lc(lua_state* l) { lual_register(l, ln_lc, lrg_lc); return 1;}
其它类似信息

推荐信息