使 用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::com2lua VT_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 "luacom" require "lc" function print_table(t) for k,v in pairs(t) do print(k,v) end end excel = luacom.CreateObject("Excel.Application") excel.Visible = true excel.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 6 print("unicode : " .. lc.bstr(ws, s2)); us, s2=lc.w2u(ws, s2); --0xe4 0xb8 0xa5 0xe4 0xb8 0xad 0x00 0x00 8 print("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 "lc" EXPORTS luaopen_lc
lc.h
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" int luaopen_local(lua_State* L); } #include <locale.h> #include <cstring> #ifdef WIN32 #include <windows.h> #include <winnls.h> #else #include <cstdlib> #endif #define LN_lc "lc" int 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); </cstdlib></winnls.h></windows.h></cstring></locale.h>
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; i<len sprintf char lual_addstring byte free lual_pushresult return int lua_u2w l result="0;" size_t len="0;" const mbstr="lua_tolstring(L," if>0) { 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; } </len>

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具