No2:luacom Chinese Content Output BUG and Correction

Keywords: Excel less Windows

Original Link: http://www.cnblogs.com/codingking/p/6491091.html

After checking, luacom has no problem, it is the code of lc conversion has problem, did not notice that lua_tolstring will contain one more space, resulting in luacom is considered to have one fewer space (add up 2 spaces to exactly end 2 characters), the idea is completely wrong, the following is obsolete.

 

cell.Value2 is always garbled when it is used to output Chinese content.The reason for utf-8 is suspected, and the result remains garbled after conversion.Write another conversion yourself test Still a mess, BUG!?

Next source for LUACOM, look at the functions tLuaCOMTypeHandler::com2lua and tStringBuffer tUtil::bstr2string.The whole process looks OK, but another test found that the result string is one bytes less.

The result returned in the tLuaCOMTypeHandler::com2luaVT_BSTR branch is exactly minus 1, modifying it

lua_pushlstring(L, str, str.getSize()-1); modified to lua_pushlstring(L, str, str.getSize());

Recompile LUACOM and look at the cell.Value2 output, and it's finally correct.It is not known if this modification will introduce errors because it has not been fully tested. Resources There is one that has been compiled.

--lc is a unicode utf-8 ansi conversion function copied from the Internet

 

  1. package.cpath=[[C:\Program Files\Lua\5.1\clibs\?.dll;d:\loonlib\sample\lc\?.dll]]  
  2. require "luacom"  
  3. require "lc"  
  4.   
  5. function print_table(t) for k,v in pairs(t) do print(k,v) end end  
  6. excel = luacom.CreateObject("Excel.Application")  
  7. excel.Visible = true  
  8. excel.Workbooks:Add();  
  9. --luacom.ViewTypeLib(excel);  
  10. sheet=excel.Sheets(1);  
  11. local r=sheet:Range("E6");  
  12.   
  13. local s = "Yanzhong";  
  14. ws, s2=lc.a2w(s); --0x25 0x4e 0x2d 0x4e 0x00 0x00 6  
  15. print("unicode : " .. lc.bstr(ws, s2));  
  16. us, s2=lc.w2u(ws, s2); --0xe4 0xb8 0xa5 0xe4 0xb8 0xad 0x00 0x00 8  
  17. print("utf8 : " .. lc.bstr(us, s2));  
  18.   
  19. r.Value2=us;  
  20. ws, s2=lc.u2w(r.Value2, s2);  
  21. print("unicode : " .. lc.bstr(ws, s2));  
  22. as, s2=lc.w2a(ws, s2);  
  23. print("ansi : " .. lc.bstr(as, s2));  
  24. print(as);  
 

 

lc.def

 

  1. LIBRARY "lc"  
  2.   
  3. EXPORTS  
  4.     luaopen_lc  
 



 

lc.h

 

  1. extern "C" {  
  2. #include "lua.h"  
  3. #include "lualib.h"   
  4. #include "lauxlib.h"  
  5. int luaopen_local(lua_State* L);  
  6. }  
  7.   
  8. #include <locale.h>  
  9. #include <cstring>  
  10. #ifdef WIN32  
  11. #include <windows.h>  
  12. #include <winnls.h>  
  13. #else  
  14. #include <cstdlib>  
  15. #endif  
  16.   
  17.   
  18. #define LN_lc "lc"  
  19. int lua_a2w(lua_State* L);  
  20. int lua_u2w(lua_State* L);  
  21. int lua_w2a(lua_State* L);  
  22. int lua_w2u(lua_State* L);  
  23. int lua_u2a(lua_State* L);  
  24. int lua_a2u(lua_State* L);  
  25. int lua_bstr(lua_State* L);  
  26.   
  27. int lua_help(lua_State* L);  
  28. wchar_t* mb2wc(const char* mbstr, int& s2, int cp);  
  29. char* wc2mb(const wchar_t* wcstr, int& s2, int cp);  
 



 

lc.cpp

 

  1. #include "lc.h"  
  2. //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   
  3.   
  4. int lua_bstr(lua_State* L) {  
  5.     const char* s = luaL_optstring(L, 1, "");  
  6.     int len = luaL_optnumber(L, 2, 0);  
  7.     if (strcmp(s, "")==0 || 0==len) {  
  8.         lua_pushstring(L, s);  
  9.     } else {  
  10.         luaL_Buffer b;  
  11.         luaL_buffinit(L, &b);  
  12.         char* byte = (char*)malloc(64);  
  13.         for (int i=0; i<len; ++i) {  
  14.             sprintf(byte, "0x%02x ", (unsigned char)*s++);  
  15.             luaL_addstring(&b, byte);  
  16.         }  
  17.         free(byte);  
  18.         luaL_pushresult(&b);  
  19.     }  
  20.     return 1;  
  21. }  
  22.   
  23. int lua_u2w(lua_State* L) {  
  24.     int result = 0;  
  25.     size_t len = 0;  
  26.     const char* mbstr = lua_tolstring(L, 1, &len);  
  27.     if (mbstr && len>0) {  
  28.         int s2 = 0;  
  29.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_UTF8);  
  30.         if (wcstr) {  
  31.             lua_pushlstring(L, (const char*)wcstr, s2);  
  32.             lua_pushnumber(L, s2);  
  33.             delete[] wcstr;  
  34.             result = 2;  
  35.         }  
  36.     }  
  37.     return result;  
  38. }  
  39.   
  40. int lua_a2w(lua_State* L) {  
  41.     int result = 0;  
  42.     size_t len = 0;  
  43.     const char* mbstr = lua_tolstring(L, 1, &len);  
  44.     if (mbstr && len>0) {  
  45.         int s2 = 0;  
  46.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_ACP);  
  47.         if (wcstr) {  
  48.             lua_pushlstring(L, (const char*)wcstr, s2);  
  49.             lua_pushnumber(L, s2);  
  50.             delete[] wcstr;  
  51.             result = 2;  
  52.         }  
  53.     }  
  54.     return result;  
  55. }  
  56.   
  57. int lua_w2a(lua_State* L) {  
  58.     int result = 0;  
  59.     size_t len = 0;  
  60.     const char* wcstr = lua_tolstring(L, 1, &len);  
  61.     if (wcstr && len>0) {  
  62.         int s2 = 0;  
  63.         char* mbstr = wc2mb((wchar_t*)wcstr, s2, CP_ACP);  
  64.         if (mbstr) {  
  65.             lua_pushlstring(L, mbstr, s2);  
  66.             lua_pushnumber(L, s2);  
  67.             delete[] mbstr;  
  68.             result = 2;  
  69.         }  
  70.     }  
  71.     return result;  
  72. }  
  73.   
  74. int lua_w2u(lua_State* L) {  
  75.     int result = 0;  
  76.     size_t len = 0;  
  77.     const char* wcstr = lua_tolstring(L, 1, &len);  
  78.     if (wcstr && len>0) {  
  79.         int s2 = 0;  
  80.         char* mbstr = wc2mb((wchar_t*)wcstr, s2, CP_UTF8);  
  81.         if (mbstr) {  
  82.             lua_pushlstring(L, mbstr, s2);  
  83.             lua_pushnumber(L, s2);  
  84.             delete[] mbstr;  
  85.             result = 2;  
  86.         }  
  87.     }  
  88.     return result;  
  89. }  
  90.   
  91. int lua_u2a(lua_State* L) {  
  92.     int result = 0;  
  93.     size_t len = 0;  
  94.     const char* mbstr = lua_tolstring(L, 1, &len);  
  95.     if (mbstr && len>0) {  
  96.         int s2 = 0;  
  97.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_UTF8);  
  98.         if (wcstr) {  
  99.             char* nmbstr = wc2mb(wcstr, s2, CP_ACP);  
  100.             if (nmbstr) {  
  101.                 lua_pushlstring(L, nmbstr, s2);  
  102.                 lua_pushnumber(L, s2);  
  103.                 result = 2;  
  104.                 delete[] nmbstr;  
  105.             }  
  106.             delete[] wcstr;  
  107.         }  
  108.     }  
  109.     return result;  
  110. }  
  111.   
  112. int lua_a2u(lua_State* L) {  
  113.     int result = 0;  
  114.     size_t len = 0;  
  115.     const char* mbstr = lua_tolstring(L, 1, &len);  
  116.     if (mbstr && len>0) {  
  117.         int s2 = 0;  
  118.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_ACP);  
  119.         if (wcstr) {  
  120.             char* nmbstr = wc2mb(wcstr, s2, CP_UTF8);  
  121.             if (nmbstr) {  
  122.                 lua_pushlstring(L, nmbstr, s2);  
  123.                 lua_pushnumber(L, s2);  
  124.                 result = 2;  
  125.                 delete[] nmbstr;  
  126.             }  
  127.             delete[] wcstr;  
  128.         }  
  129.     }  
  130.     return result;  
  131. }  
  132.   
  133. wchar_t* mb2wc(const char* mbstr, int& s2, int cp) {  
  134.     wchar_t* wcstr = NULL;  
  135. #ifdef WIN32  
  136.     int size = MultiByteToWideChar(cp, 0, mbstr, -1, NULL, 0);  
  137. #else  
  138.     size_t size = mbstowcs(NULL, mbstr, 0);  
  139. #endif  
  140.     wcstr = new wchar_t[size];  
  141.     if (wcstr) {  
  142.         memset(wcstr, 0, size * sizeof(wchar_t));  
  143. #ifdef WIN32  
  144.         int ret = MultiByteToWideChar(cp, 0, mbstr, -1, wcstr, size);  
  145.         if (ret == 0) { // MultiByteToWideChar returns 0 if it does not succeed.  
  146. #else  
  147.         size_t ret = mbstowcs(wcstr, mbstr, size+1);  
  148.         if (ret == -1) {  
  149. #endif  
  150.             delete[] wcstr;  
  151.             wcstr = NULL;  
  152.         }  
  153.         s2 = 2*size;  
  154.     }  
  155.     return wcstr;  
  156. }  
  157.   
  158. char* wc2mb(const wchar_t* wcstr, int& s2, int cp) {  
  159.     char* mbstr = NULL;  
  160. #ifdef WIN32  
  161.     int size = WideCharToMultiByte(cp, 0, wcstr, -1, NULL, 0, NULL, NULL);  
  162. #else  
  163.     size_t size = wcstombs(NULL, wcstr, 0);  
  164. #endif  
  165.     mbstr = new char[size];  
  166.     if (mbstr) {  
  167.         memset(mbstr, 0, size * sizeof(char));  
  168. #ifdef WIN32  
  169.         int ret = WideCharToMultiByte(cp, 0, wcstr, -1, mbstr, size, NULL, NULL);  
  170.         if (ret == 0) { // MultiByteToWideChar returns 0 if it does not succeed.  
  171. #else  
  172.         size_t ret = wcstombs(mbstr, wcstr, size+1);  
  173.         if (ret == -1) {  
  174. #endif  
  175.             delete[] mbstr;  
  176.             mbstr = NULL;  
  177.         }  
  178.         s2 = size;  
  179.     }  
  180.     return mbstr;  
  181. }  
  182.   
  183. int lua_help(lua_State* L) {  
  184.     const char* s=   
  185.         "Simple Characters Transformation\n"  
  186.         "  a2w(ansi to unicode)\n"  
  187.         "  u2w(utf8 to unicode)\n"  
  188.         "  w2a(unicode to ansi)\n"  
  189.         "  w2u(unicode to utf8)\n"  
  190.         "  u2a(utf8 to ansi)\n"  
  191.         "  a2u(ansi to utf8)\n"  
  192.         "  bstr(bytes of str)\n"  
  193.         "  help(show this)\n\n"  
  194.         "  example :\n"  
  195.         "    local s = \"I like lua\"\n"  
  196.         "    print(lc.bstr(s, string.len(s)+1))\n"  
  197.         "    local ws, s2 = lc.a2w(s)\n"  
  198.         "wunoman@qq.com 2012/03/06\n"  
  199.         ;  
  200.     lua_pushstring(L, s);  
  201.   
  202.     return 1;  
  203. }  
  204.   
  205. luaL_reg lrg_lc[] = {  
  206.     {"a2w", lua_a2w},  
  207.     {"u2w", lua_u2w},  
  208.     {"w2a", lua_w2a},  
  209.     {"w2u", lua_w2u},  
  210.     {"u2a", lua_u2a},  
  211.     {"a2u", lua_a2u},  
  212.     {"bstr", lua_bstr},  
  213.     {"help", lua_help},  
  214.     {NULL, NULL}  
  215. };  
  216.   
  217. extern "C" int luaopen_lc(lua_State* L) {  
  218.     luaL_register(L, LN_lc, lrg_lc);  
  219.     return 1;  
  220. }  

After checking, luacom has no problem, it is the code of lc conversion has problem, did not notice that lua_tolstring will contain one more space, resulting in luacom is considered to have one less space (add up 2 spaces to exactly end 2 characters), the idea is completely wrong, and will be discarded below.

 

cell.Value2 is always garbled when it is used to output Chinese content.The reason for utf-8 is suspected, and the result remains garbled after conversion.Write another conversion yourself test Still a mess, BUG!?

Next source for LUACOM, look at the functions tLuaCOMTypeHandler::com2lua and tStringBuffer tUtil::bstr2string.The whole process looks OK, but another test found that the result string is one bytes less.

The result returned in the tLuaCOMTypeHandler::com2luaVT_BSTR branch is exactly minus 1, modifying it

lua_pushlstring(L, str, str.getSize()-1); modified to lua_pushlstring(L, str, str.getSize());

Recompile LUACOM and look at the cell.Value2 output, and it's finally correct.It is not known if this modification will introduce errors because it has not been fully tested. Resources There is one that has been compiled.

--lc is a unicode utf-8 ansi conversion function copied from the Internet

 

  1. package.cpath=[[C:\Program Files\Lua\5.1\clibs\?.dll;d:\loonlib\sample\lc\?.dll]]  
  2. require "luacom"  
  3. require "lc"  
  4.   
  5. function print_table(t) for k,v in pairs(t) do print(k,v) end end  
  6. excel = luacom.CreateObject("Excel.Application")  
  7. excel.Visible = true  
  8. excel.Workbooks:Add();  
  9. --luacom.ViewTypeLib(excel);  
  10. sheet=excel.Sheets(1);  
  11. local r=sheet:Range("E6");  
  12.   
  13. local s = "Yanzhong";  
  14. ws, s2=lc.a2w(s); --0x25 0x4e 0x2d 0x4e 0x00 0x00 6  
  15. print("unicode : " .. lc.bstr(ws, s2));  
  16. us, s2=lc.w2u(ws, s2); --0xe4 0xb8 0xa5 0xe4 0xb8 0xad 0x00 0x00 8  
  17. print("utf8 : " .. lc.bstr(us, s2));  
  18.   
  19. r.Value2=us;  
  20. ws, s2=lc.u2w(r.Value2, s2);  
  21. print("unicode : " .. lc.bstr(ws, s2));  
  22. as, s2=lc.w2a(ws, s2);  
  23. print("ansi : " .. lc.bstr(as, s2));  
  24. print(as);  

 

lc.def

 

  1. LIBRARY "lc"  
  2.   
  3. EXPORTS  
  4.     luaopen_lc  



 

lc.h

 

  1. extern "C" {  
  2. #include "lua.h"  
  3. #include "lualib.h"   
  4. #include "lauxlib.h"  
  5. int luaopen_local(lua_State* L);  
  6. }  
  7.   
  8. #include <locale.h>  
  9. #include <cstring>  
  10. #ifdef WIN32  
  11. #include <windows.h>  
  12. #include <winnls.h>  
  13. #else  
  14. #include <cstdlib>  
  15. #endif  
  16.   
  17.   
  18. #define LN_lc "lc"  
  19. int lua_a2w(lua_State* L);  
  20. int lua_u2w(lua_State* L);  
  21. int lua_w2a(lua_State* L);  
  22. int lua_w2u(lua_State* L);  
  23. int lua_u2a(lua_State* L);  
  24. int lua_a2u(lua_State* L);  
  25. int lua_bstr(lua_State* L);  
  26.   
  27. int lua_help(lua_State* L);  
  28. wchar_t* mb2wc(const char* mbstr, int& s2, int cp);  
  29. char* wc2mb(const wchar_t* wcstr, int& s2, int cp);  



 

lc.cpp

 

  1. #include "lc.h"  
  2. //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   
  3.   
  4. int lua_bstr(lua_State* L) {  
  5.     const char* s = luaL_optstring(L, 1, "");  
  6.     int len = luaL_optnumber(L, 2, 0);  
  7.     if (strcmp(s, "")==0 || 0==len) {  
  8.         lua_pushstring(L, s);  
  9.     } else {  
  10.         luaL_Buffer b;  
  11.         luaL_buffinit(L, &b);  
  12.         char* byte = (char*)malloc(64);  
  13.         for (int i=0; i<len; ++i) {  
  14.             sprintf(byte, "0x%02x ", (unsigned char)*s++);  
  15.             luaL_addstring(&b, byte);  
  16.         }  
  17.         free(byte);  
  18.         luaL_pushresult(&b);  
  19.     }  
  20.     return 1;  
  21. }  
  22.   
  23. int lua_u2w(lua_State* L) {  
  24.     int result = 0;  
  25.     size_t len = 0;  
  26.     const char* mbstr = lua_tolstring(L, 1, &len);  
  27.     if (mbstr && len>0) {  
  28.         int s2 = 0;  
  29.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_UTF8);  
  30.         if (wcstr) {  
  31.             lua_pushlstring(L, (const char*)wcstr, s2);  
  32.             lua_pushnumber(L, s2);  
  33.             delete[] wcstr;  
  34.             result = 2;  
  35.         }  
  36.     }  
  37.     return result;  
  38. }  
  39.   
  40. int lua_a2w(lua_State* L) {  
  41.     int result = 0;  
  42.     size_t len = 0;  
  43.     const char* mbstr = lua_tolstring(L, 1, &len);  
  44.     if (mbstr && len>0) {  
  45.         int s2 = 0;  
  46.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_ACP);  
  47.         if (wcstr) {  
  48.             lua_pushlstring(L, (const char*)wcstr, s2);  
  49.             lua_pushnumber(L, s2);  
  50.             delete[] wcstr;  
  51.             result = 2;  
  52.         }  
  53.     }  
  54.     return result;  
  55. }  
  56.   
  57. int lua_w2a(lua_State* L) {  
  58.     int result = 0;  
  59.     size_t len = 0;  
  60.     const char* wcstr = lua_tolstring(L, 1, &len);  
  61.     if (wcstr && len>0) {  
  62.         int s2 = 0;  
  63.         char* mbstr = wc2mb((wchar_t*)wcstr, s2, CP_ACP);  
  64.         if (mbstr) {  
  65.             lua_pushlstring(L, mbstr, s2);  
  66.             lua_pushnumber(L, s2);  
  67.             delete[] mbstr;  
  68.             result = 2;  
  69.         }  
  70.     }  
  71.     return result;  
  72. }  
  73.   
  74. int lua_w2u(lua_State* L) {  
  75.     int result = 0;  
  76.     size_t len = 0;  
  77.     const char* wcstr = lua_tolstring(L, 1, &len);  
  78.     if (wcstr && len>0) {  
  79.         int s2 = 0;  
  80.         char* mbstr = wc2mb((wchar_t*)wcstr, s2, CP_UTF8);  
  81.         if (mbstr) {  
  82.             lua_pushlstring(L, mbstr, s2);  
  83.             lua_pushnumber(L, s2);  
  84.             delete[] mbstr;  
  85.             result = 2;  
  86.         }  
  87.     }  
  88.     return result;  
  89. }  
  90.   
  91. int lua_u2a(lua_State* L) {  
  92.     int result = 0;  
  93.     size_t len = 0;  
  94.     const char* mbstr = lua_tolstring(L, 1, &len);  
  95.     if (mbstr && len>0) {  
  96.         int s2 = 0;  
  97.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_UTF8);  
  98.         if (wcstr) {  
  99.             char* nmbstr = wc2mb(wcstr, s2, CP_ACP);  
  100.             if (nmbstr) {  
  101.                 lua_pushlstring(L, nmbstr, s2);  
  102.                 lua_pushnumber(L, s2);  
  103.                 result = 2;  
  104.                 delete[] nmbstr;  
  105.             }  
  106.             delete[] wcstr;  
  107.         }  
  108.     }  
  109.     return result;  
  110. }  
  111.   
  112. int lua_a2u(lua_State* L) {  
  113.     int result = 0;  
  114.     size_t len = 0;  
  115.     const char* mbstr = lua_tolstring(L, 1, &len);  
  116.     if (mbstr && len>0) {  
  117.         int s2 = 0;  
  118.         wchar_t* wcstr = mb2wc(mbstr, s2, CP_ACP);  
  119.         if (wcstr) {  
  120.             char* nmbstr = wc2mb(wcstr, s2, CP_UTF8);  
  121.             if (nmbstr) {  
  122.                 lua_pushlstring(L, nmbstr, s2);  
  123.                 lua_pushnumber(L, s2);  
  124.                 result = 2;  
  125.                 delete[] nmbstr;  
  126.             }  
  127.             delete[] wcstr;  
  128.         }  
  129.     }  
  130.     return result;  
  131. }  
  132.   
  133. wchar_t* mb2wc(const char* mbstr, int& s2, int cp) {  
  134.     wchar_t* wcstr = NULL;  
  135. #ifdef WIN32  
  136.     int size = MultiByteToWideChar(cp, 0, mbstr, -1, NULL, 0);  
  137. #else  
  138.     size_t size = mbstowcs(NULL, mbstr, 0);  
  139. #endif  
  140.     wcstr = new wchar_t[size];  
  141.     if (wcstr) {  
  142.         memset(wcstr, 0, size * sizeof(wchar_t));  
  143. #ifdef WIN32  
  144.         int ret = MultiByteToWideChar(cp, 0, mbstr, -1, wcstr, size);  
  145.         if (ret == 0) { // MultiByteToWideChar returns 0 if it does not succeed.  
  146. #else  
  147.         size_t ret = mbstowcs(wcstr, mbstr, size+1);  
  148.         if (ret == -1) {  
  149. #endif  
  150.             delete[] wcstr;  
  151.             wcstr = NULL;  
  152.         }  
  153.         s2 = 2*size;  
  154.     }  
  155.     return wcstr;  
  156. }  
  157.   
  158. char* wc2mb(const wchar_t* wcstr, int& s2, int cp) {  
  159.     char* mbstr = NULL;  
  160. #ifdef WIN32  
  161.     int size = WideCharToMultiByte(cp, 0, wcstr, -1, NULL, 0, NULL, NULL);  
  162. #else  
  163.     size_t size = wcstombs(NULL, wcstr, 0);  
  164. #endif  
  165.     mbstr = new char[size];  
  166.     if (mbstr) {  
  167.         memset(mbstr, 0, size * sizeof(char));  
  168. #ifdef WIN32  
  169.         int ret = WideCharToMultiByte(cp, 0, wcstr, -1, mbstr, size, NULL, NULL);  
  170.         if (ret == 0) { // MultiByteToWideChar returns 0 if it does not succeed.  
  171. #else  
  172.         size_t ret = wcstombs(mbstr, wcstr, size+1);  
  173.         if (ret == -1) {  
  174. #endif  
  175.             delete[] mbstr;  
  176.             mbstr = NULL;  
  177.         }  
  178.         s2 = size;  
  179.     }  
  180.     return mbstr;  
  181. }  
  182.   
  183. int lua_help(lua_State* L) {  
  184.     const char* s=   
  185.         "Simple Characters Transformation\n"  
  186.         "  a2w(ansi to unicode)\n"  
  187.         "  u2w(utf8 to unicode)\n"  
  188.         "  w2a(unicode to ansi)\n"  
  189.         "  w2u(unicode to utf8)\n"  
  190.         "  u2a(utf8 to ansi)\n"  
  191.         "  a2u(ansi to utf8)\n"  
  192.         "  bstr(bytes of str)\n"  
  193.         "  help(show this)\n\n"  
  194.         "  example :\n"  
  195.         "    local s = \"I like lua\"\n"  
  196.         "    print(lc.bstr(s, string.len(s)+1))\n"  
  197.         "    local ws, s2 = lc.a2w(s)\n"  
  198.         "wunoman@qq.com 2012/03/06\n"  
  199.         ;  
  200.     lua_pushstring(L, s);  
  201.   
  202.     return 1;  
  203. }  
  204.   
  205. luaL_reg lrg_lc[] = {  
  206.     {"a2w", lua_a2w},  
  207.     {"u2w", lua_u2w},  
  208.     {"w2a", lua_w2a},  
  209.     {"w2u", lua_w2u},  
  210.     {"u2a", lua_u2a},  
  211.     {"a2u", lua_a2u},  
  212.     {"bstr", lua_bstr},  
  213.     {"help", lua_help},  
  214.     {NULL, NULL}  
  215. };  
  216.   
  217. extern "C" int luaopen_lc(lua_State* L) {  
  218.     luaL_register(L, LN_lc, lrg_lc);  
  219.     return 1;  
  220. }  

Reprinted at: https://www.cnblogs.com/codingking/p/6491091.html

Posted by joebWI on Thu, 25 Jul 2019 19:12:51 -0700