首頁 資料庫 mysql教程 No2:luacom中文内容输出BUG及修正

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

Jun 07, 2016 pm 03:37 PM
bug 中文 更正 內容 輸出

使 用cell.Value2输出中文内容时总是乱码。怀疑是utf-8的原因,转换后结果仍然是乱码。自己再写个转换的再测试,依然是乱码,莫非有BUG!? 下个LUACOM的源码,查看函数 tLuaCOMTypeHandler::com2lua 和 tStringBuffer tUtil::bstr2string 。整个过程看起来

    使用cell.Value2输出中文内容时总是乱码。怀疑是utf-8的原因,转换后结果仍然是乱码。自己再写个转换的再测试,依然是乱码,莫非有BUG!?

下个LUACOM的源码,查看函数tLuaCOMTypeHandler::com2luatStringBuffer 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>
登入後複製



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使命召喚戰區手遊怎麼設定中文 使命召喚戰區手遊怎麼設定中文 Mar 22, 2024 am 08:41 AM

使命召喚戰區作為全新上線的一款手遊,有很多的玩家都非常的好奇要怎麼樣才能夠將這款遊戲的語言設定為中文,其實非常的簡單,玩家只需要下載中文的語言包,隨後進行使用就可以進行修改了,詳細的內容可以在這篇中文設定方法介紹之中進行了解,讓我們一起來看看吧。使命召喚戰區手遊怎麼設定中文1、先進入遊戲,點選介面右上角的設定圖示。 2.在出現的選單列中,找到【Download】這個選項並且點選。 3.在這個頁面中選擇【SIMPLIFIEDCHINESE】(簡體中文),就可以對簡體中文的安裝包進行下載了。 4.回到設

如何在PHP Dompdf中正確顯示中文字符 如何在PHP Dompdf中正確顯示中文字符 Mar 05, 2024 pm 01:03 PM

如何在PHPDompdf中正確顯示中文字元在使用PHPDompdf產生PDF檔案時,遇到中文字元顯示亂碼的問題是一個常見的挑戰。這是因為Dompdf預設使用的字體庫中不包含中文字元集。為了正確顯示中文字符,我們需要手動設定Dompdf的字體,並確保選擇支援中文字符的字體。以下是一些具體的步驟和程式碼範例來解決這個問題:第一步:下載中文字體檔案首先,我們需要

VSCode 設定中文:完全指南 VSCode 設定中文:完全指南 Mar 25, 2024 am 11:18 AM

VSCode設定中文:完整指南在軟體開發中,VisualStudioCode(簡稱VSCode)是一個常用的整合開發環境。對於使用中文的開發者來說,將VSCode設定為中文介面可以提升工作效率。本文將為大家提供一個完整的指南,詳細介紹如何將VSCode設定為中文介面,並提供具體的程式碼範例。第一步:下載安裝語言包開啟VSCode後,點選左

修復PHP Dompdf中文亂碼的有效途徑 修復PHP Dompdf中文亂碼的有效途徑 Mar 05, 2024 pm 04:45 PM

標題:修復PHPDompdf中文亂碼的有效途徑在使用PHPDompdf產生PDF文件時,中文字元出現亂碼是一個常見的問題。這問題通常源自於Dompdf預設不支援中文字元集,導致中文內容無法正確顯示。為了解決這個問題,我們需要採取一些有效的途徑來修復PHPDompdf中文亂碼的問題。 1.使用自訂字型檔案一個解決Dompdf中文亂碼問題的有效方法是使用

Excel表格怎麼設定顯示中文? Excel切換中文操作教學 Excel表格怎麼設定顯示中文? Excel切換中文操作教學 Mar 14, 2024 pm 03:28 PM

Excel表格是現在很多人都在使用的辦公室軟體之一,有些使用者因為電腦是win11系統,因此顯示的是英文介面,想要切換成中文介面,但是不知道該怎麼操作,針對這個問題,本期小編就來為廣大用戶們回答,一起來看看今日軟體教學所分享的內容。  Excel切換中文操作教學:  1、進入軟體,點選頁面上方工具列左側的「File」選項。  2、在下方給出的選項中選擇「options」。  3、進入新介面後,點選左側的「language」選項

wwe2k24會有中文嗎 wwe2k24會有中文嗎 Mar 13, 2024 pm 04:40 PM

《WWE2K24》乃由VisualConcepts傾力打造的競速運動遊,已於2024年3月9日正式問世。此款遊戲倍受讚譽,許多玩家熱切關注其是否設有中文版。遺憾的是,迄今為止,《WWE2K24》尚未推出中文語言版本。 wwe2k24會有中文嗎答:目前不支援中文。 WWE2K24在Steam國區的標準版售價為199元,豪華版為329元,紀念版為395元。遊戲的配置需求較高,無論處理器、顯示卡或運行記憶體等方面,均有一定標準。官方推薦配置以及最低配置介紹:

Microsoft Edge瀏覽器開啟是360導航怎麼改-更改開啟是360導航的方法 Microsoft Edge瀏覽器開啟是360導航怎麼改-更改開啟是360導航的方法 Mar 04, 2024 pm 01:50 PM

怎麼更改MicrosoftEdge瀏覽器打開是360導航的頁面呢?其實很簡單,那麼現在小編就和大家一起分享關於更改MicrosoftEdge瀏覽器打開是360導航頁面的方法,有需要的朋友可以來看看哦,希望可以幫助大家。開啟MicrosoftEdge瀏覽器。我們看到是下圖這種頁面。點擊右上角的三點圖示。點選“設定”。在設定頁面的左側欄裡點選「啟動時」。點選右側欄裡的圖中示意的三點(不要能點選「開啟新標籤頁」),然後點選編輯,將網址改成「0」(或其他無意義的數字)。然後點選「儲存」。接下來,選擇“

balatro設定中文方法 balatro設定中文方法 Mar 07, 2024 pm 09:10 PM

balatro這款遊戲的預設語言是英語,但玩家可以在Steam中設定語言為中文,有些玩家還不知道要怎麼設置,下面就帶給大家balatro設定為中文的方法。 balatro怎麼設定中文1、先開啟Steam,點選庫,找到balatro,右鍵選擇屬性。 2.在屬性介面中可以看到語言,點選進入語言設定介面。 3.玩家可以將遊戲的語言設定為簡體中文,也可以設定成其他語言。 4.之後玩家需要重啟Steam,然後進入遊戲就可以看到已經是中文了。以上就是balatro設定中文的方法,還是比較簡單的,玩家可以嘗試

See all articles