Heim Datenbank MySQL-Tutorial 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);
Nach dem Login kopieren

lc.def

LIBRARY	"lc"

EXPORTS
	luaopen_lc
Nach dem Login kopieren


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>
Nach dem Login kopieren


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>
Nach dem Login kopieren



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So stellen Sie Chinesisch im Handyspiel Call of Duty: Warzone ein So stellen Sie Chinesisch im Handyspiel Call of Duty: Warzone ein Mar 22, 2024 am 08:41 AM

Call of Duty Warzone ist ein neu eingeführtes Handyspiel. Viele Spieler sind sehr neugierig, wie sie die Sprache dieses Spiels auf Chinesisch einstellen können. Tatsächlich ist es sehr einfach, das chinesische Sprachpaket herunterzuladen Den detaillierten Inhalt erfahren Sie in dieser Einführung in die chinesische Einstellungsmethode. So stellen Sie die chinesische Sprache für das Handyspiel Call of Duty: Warzone ein 1. Rufen Sie zunächst das Spiel auf und klicken Sie auf das Einstellungssymbol in der oberen rechten Ecke der Benutzeroberfläche. 2. Suchen Sie in der angezeigten Menüleiste die Option [Herunterladen] und klicken Sie darauf. 3. Wählen Sie auf dieser Seite [SIMPLIFIEDCHINESE] (vereinfachtes Chinesisch), um das Installationspaket für vereinfachtes Chinesisch herunterzuladen. 4. Kehren Sie zu den Einstellungen zurück

Einrichten von Chinesisch mit VSCode: Die vollständige Anleitung Einrichten von Chinesisch mit VSCode: Die vollständige Anleitung Mar 25, 2024 am 11:18 AM

VSCode-Setup auf Chinesisch: Eine vollständige Anleitung In der Softwareentwicklung ist Visual Studio Code (kurz VSCode) eine häufig verwendete integrierte Entwicklungsumgebung. Für Entwickler, die Chinesisch verwenden, kann die Einstellung von VSCode auf die chinesische Schnittstelle die Arbeitseffizienz verbessern. In diesem Artikel erhalten Sie eine vollständige Anleitung, die detailliert beschreibt, wie Sie VSCode auf eine chinesische Schnittstelle einstellen, und spezifische Codebeispiele bereitstellt. Schritt 1: Laden Sie das Sprachpaket herunter und installieren Sie es. Klicken Sie nach dem Öffnen von VSCode auf links

So stellen Sie chinesische Schriftzeichen in PHP Dompdf korrekt dar So stellen Sie chinesische Schriftzeichen in PHP Dompdf korrekt dar Mar 05, 2024 pm 01:03 PM

So zeigen Sie chinesische Schriftzeichen in PHPDompdf korrekt an. Wenn Sie PHPDompdf zum Generieren von PDF-Dateien verwenden, besteht häufig die Herausforderung, dass das Problem verstümmelter chinesischer Schriftzeichen auftritt. Dies liegt daran, dass die von Dompdf standardmäßig verwendete Schriftartenbibliothek keine chinesischen Zeichensätze enthält. Um chinesische Schriftzeichen korrekt anzuzeigen, müssen wir die Schriftart von Dompdf manuell festlegen und sicherstellen, dass eine Schriftart ausgewählt wird, die chinesische Schriftzeichen unterstützt. Hier sind einige spezifische Schritte und Codebeispiele, um dieses Problem zu lösen: Schritt 1: Laden Sie die chinesische Schriftartdatei herunter. Zuerst benötigen wir

Wie stelle ich eine Excel-Tabelle so ein, dass Chinesisch angezeigt wird? Tutorial zum Wechseln der chinesischen Bedienung in Excel Wie stelle ich eine Excel-Tabelle so ein, dass Chinesisch angezeigt wird? Tutorial zum Wechseln der chinesischen Bedienung in Excel Mar 14, 2024 pm 03:28 PM

Excel-Tabelle ist eine der Office-Software, die viele Benutzer verwenden, da ihr Computer ein Win11-System ist und daher die englische Benutzeroberfläche angezeigt wird. Sie möchten auf die chinesische Benutzeroberfläche umsteigen, wissen aber nicht, wie man sie bedient Um dieses Problem zu lösen, ist der Herausgeber hier, um die Fragen aller Benutzer zu beantworten. Werfen wir einen Blick auf den Inhalt des heutigen Software-Tutorials. Anleitung zum Umstellen von Excel auf Chinesisch: 1. Rufen Sie die Software auf und klicken Sie links in der Symbolleiste oben auf der Seite auf die Option „Datei“. 2. Wählen Sie „Optionen“ aus den unten aufgeführten Optionen. 3. Nachdem Sie die neue Benutzeroberfläche aufgerufen haben, klicken Sie links auf die Option „Sprache“.

Eine effektive Möglichkeit, verstümmelte chinesische Zeichen in PHP Dompdf zu korrigieren Eine effektive Möglichkeit, verstümmelte chinesische Zeichen in PHP Dompdf zu korrigieren Mar 05, 2024 pm 04:45 PM

Titel: Eine effektive Möglichkeit, verstümmelte chinesische Zeichen in PHPDompdf zu reparieren. Bei der Verwendung von PHPDompdf zum Generieren von PDF-Dokumenten sind verstümmelte chinesische Zeichen ein häufiges Problem. Dieses Problem ist in der Regel darauf zurückzuführen, dass Dompdf standardmäßig keine chinesischen Zeichensätze unterstützt, was dazu führt, dass chinesische Inhalte nicht korrekt angezeigt werden. Um dieses Problem zu lösen, müssen wir einige effektive Wege finden, um das chinesische verstümmelte Problem von PHPDompdf zu beheben. 1. Verwenden Sie benutzerdefinierte Schriftartdateien, um das Problem verstümmelter chinesischer Zeichen in Dompdf zu lösen

So ändern Sie den Microsoft Edge-Browser so, dass er mit 360-Navigation geöffnet wird - So ändern Sie die Öffnung mit 360-Navigation So ändern Sie den Microsoft Edge-Browser so, dass er mit 360-Navigation geöffnet wird - So ändern Sie die Öffnung mit 360-Navigation Mar 04, 2024 pm 01:50 PM

Wie ändere ich die Seite, die den Microsoft Edge-Browser öffnet, auf 360-Navigation? Es ist eigentlich sehr einfach, deshalb werde ich Ihnen jetzt die Methode vorstellen, die Seite zu ändern, die den Microsoft Edge-Browser auf 360-Navigation öffnet Schau mal. Ich hoffe, ich kann allen helfen. Öffnen Sie den Microsoft Edge-Browser. Wir sehen eine Seite wie die folgende. Klicken Sie auf das Dreipunktsymbol in der oberen rechten Ecke. Klicken Sie auf „Einstellungen“. Klicken Sie in der linken Spalte der Einstellungsseite auf „Beim Start“. Klicken Sie auf die drei im Bild in der rechten Spalte angezeigten Punkte (klicken Sie nicht auf „Neuen Tab öffnen“), klicken Sie dann auf Bearbeiten und ändern Sie die URL in „0“ (oder andere bedeutungslose Zahlen). Klicken Sie anschließend auf „Speichern“. Wählen Sie als Nächstes „

Wird wwe2k24 Chinesisch haben? Wird wwe2k24 Chinesisch haben? Mar 13, 2024 pm 04:40 PM

„WWE2K24“ ist ein von Visual Concepts entwickeltes Rennsportspiel, das am 9. März 2024 offiziell veröffentlicht wurde. Dieses Spiel wurde hoch gelobt und viele Spieler sind gespannt, ob es eine chinesische Version geben wird. Leider hat „WWE2K24“ bisher noch keine chinesische Sprachversion veröffentlicht. Wird wwe2k24 auf Chinesisch sein? Antwort: Chinesisch wird derzeit nicht unterstützt. Die Standardversion von WWE2K24 in der chinesischen Steam-Region kostet 199 Yuan, die Deluxe-Version 329 Yuan und die Gedenkausgabe 395 Yuan. Das Spiel stellt relativ hohe Konfigurationsanforderungen und es gibt bestimmte Standards in Bezug auf Prozessor, Grafikkarte oder laufenden Speicher. Offizielle empfohlene Konfiguration und Einführung in die Mindestkonfiguration:

Zusammenfassung der Apple iOS18-Fehler Zusammenfassung der Apple iOS18-Fehler Jun 14, 2024 pm 01:48 PM

Als die WWDC-Konferenz 2024 von Apple erfolgreich zu Ende ging, wurde nicht nur macos15 angekündigt, sondern auch das Update von Apples neuem iOS18-System erregte die meiste Aufmerksamkeit. Obwohl es viele neue Funktionen gibt, fragen sich die Leute unweigerlich, ob dies die erste Version von Apples iOS18 ist Es ist notwendig, Apple iOS18 zu aktualisieren. Welche Art von Fehlern gibt es in der neuesten Version von Apple iOS18? Nach der tatsächlichen Nutzungsbewertung finden Sie im Folgenden eine Zusammenfassung der Apple iOS18-Fehler. Werfen wir einen Blick darauf. Derzeit beeilen sich viele iPhone-Benutzer, auf iOS18 zu aktualisieren. Allerdings bereiten verschiedene Systemfehler den Menschen Unbehagen. Einige Blogger sagten, dass man beim Upgrade auf iOS18 vorsichtig sein sollte, weil „es so viele Fehler gibt“. Der Blogger sagte, wenn Ihr iPhone ist

See all articles