ホームページ データベース 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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Call of Duty: Warzone モバイル ゲームで中国語を設定する方法 Call of Duty: Warzone モバイル ゲームで中国語を設定する方法 Mar 22, 2024 am 08:41 AM

Call of Duty Warzone は新しくリリースされたモバイル ゲームです。多くのプレイヤーは、このゲームの言語を中国語に設定する方法に非常に興味があります。実際、それは非常に簡単です。プレイヤーは中国語の言語パックをダウンロードするだけで、その後、次のことができます詳しい内容はこちらの中国語設定方法紹介で解説していますので、一緒に見ていきましょう。モバイル ゲーム Call of Duty: Warzone に中国語を設定する方法 1. まずゲームに入り、インターフェースの右上隅にある設定アイコンをクリックします。 2. 表示されるメニューバーで、[ダウンロード]オプションを見つけてクリックします。 3. このページの[SIMPLIFIEDCHINESE](簡体字中国語)を選択して、簡体字中国語のインストールパッケージをダウンロードします。 4. 設定に戻ります

VSCode を使用した中国語のセットアップ: 完全ガイド VSCode を使用した中国語のセットアップ: 完全ガイド Mar 25, 2024 am 11:18 AM

中国語での VSCode セットアップ: 完全ガイド ソフトウェア開発では、Visual Studio Code (略して VSCode) が一般的に使用される統合開発環境です。中国語を使用する開発者は、VSCode を中国語インターフェイスに設定すると、作業効率が向上します。この記事では、VSCode を中国語インターフェイスに設定する方法を詳しく説明し、具体的なコード例を示す完全なガイドを提供します。ステップ 1: 言語パックをダウンロードしてインストールします。VSCode を開いた後、左側の

PHP Dompdf で中国語の文字を正しく表示する方法 PHP Dompdf で中国語の文字を正しく表示する方法 Mar 05, 2024 pm 01:03 PM

PHPDompdf で中国語の文字を正しく表示する方法 PHPDompdf を使用して PDF ファイルを生成する場合、中国語の文字化けの問題がよく発生します。これは、Dompdf がデフォルトで使用するフォント ライブラリに中国語の文字セットが含まれていないためです。中国語の文字を正しく表示するには、Dompdf のフォントを手動で設定し、中国語の文字をサポートするフォントを必ず選択する必要があります。この問題を解決するための具体的な手順とコード例をいくつか示します。 ステップ 1: 中国語フォント ファイルをダウンロードします。

Excelのテーブルに中国語を表示するように設定するにはどうすればよいですか? Excel切り替え中国語操作チュートリアル Excelのテーブルに中国語を表示するように設定するにはどうすればよいですか? Excel切り替え中国語操作チュートリアル Mar 14, 2024 pm 03:28 PM

Excelスプレッドシートは現在多くの人が使っているオフィスソフトの一つですが、パソコンがWin11なので英語のインターフェースが表示されていて、中国語のインターフェースに切り替えたいけど操作方法が分からないという方もいらっしゃいます。この問題を解決するには、この問題エディターがすべてのユーザーの質問に答えるためにここにあります。今日のソフトウェア チュートリアルで共有されるコンテンツを見てみましょう。 Excel を中国語に切り替えるためのチュートリアル: 1. ソフトウェアを起動し、ページ上部のツールバーの左側にある [ファイル] オプションをクリックします。 2. 以下の選択肢から「オプション」を選択します。 3. 新しいインターフェースに入ったら、左側の「言語」オプションをクリックします。

PHP Dompdf で中国語の文字化けを修正する効果的な方法 PHP Dompdf で中国語の文字化けを修正する効果的な方法 Mar 05, 2024 pm 04:45 PM

タイトル: PHPDompdf で中国語の文字化けを修復する効果的な方法. PHPDompdf を使用して PDF ドキュメントを生成する場合、中国語の文字化けは一般的な問題です。この問題は通常、Dompdf がデフォルトで中国語の文字セットをサポートしていないため、中国語のコンテンツが正しく表示されないことが原因で発生します。この問題を解決するには、PHPDompdf の中国語文字化け問題を解決するいくつかの効果的な方法を講じる必要があります。 1. カスタム フォント ファイルを使用する Dompdf の中国語文字化けの問題を解決する効果的な方法は、

Microsoft Edge ブラウザーを 360 ナビゲーションで開くように変更する方法 - 360 ナビゲーションで開くように変更する方法 Microsoft Edge ブラウザーを 360 ナビゲーションで開くように変更する方法 - 360 ナビゲーションで開くように変更する方法 Mar 04, 2024 pm 01:50 PM

Microsoft Edge ブラウザーを開くページを 360 ナビゲーションに変更するにはどうすればよいですか? それは実際には非常に簡単なので、ここで Microsoft Edge ブラウザーを開くページを 360 ナビゲーションに変更する方法を共有します。見てください。皆さんのお役に立てれば幸いです。 Microsoft Edgeブラウザを開きます。以下のようなページが表示されます。右上隅にある三点アイコンをクリックします。 「設定」をクリックします。設定ページの左欄にある「起動時」をクリックします。右の列の図に示されている 3 つの点をクリックし ([新しいタブを開く] をクリックしないでください)、[編集] をクリックして URL を「0」(またはその他の意味のない数字) に変更します。次に、「保存」をクリックします。次に「」を選択します。

wwe2k24には中国語が登場しますか? wwe2k24には中国語が登場しますか? Mar 13, 2024 pm 04:40 PM

『WWE2K24』はVisual Conceptsが制作し、2024年3月9日に正式リリースされたレーシングスポーツゲームです。このゲームは非常に高く評価されており、多くのプレイヤーが中国語版がリリースされるかどうかに熱心に興味を持っています。残念ながら、今のところ「WWE2K24」は中国語版をまだローンチしていない。 wwe2k24 は中国語になりますか? 回答: 中国語は現在サポートされていません。 Steam中国地域におけるWWE2K24の標準版の価格は199元、デラックス版は329元、記念版は395元です。ゲームには比較的高い構成要件があり、プロセッサ、グラフィックス カード、または実行メモリに関して特定の基準があります。公式推奨構成と最小構成の紹介:

Apple iOS18 のバグの概要 Apple iOS18 のバグの概要 Jun 14, 2024 pm 01:48 PM

Apple の WWDC カンファレンス 2024 が成功裡に終了する中、macos15 が発表されただけでなく、Apple の新しい iOS18 システムのアップデートが最も注目を集めました。Apple の iOS18 の最初のバージョンとして、多くの新機能がありますが、人々は必然的にそれがどうか疑問に思います。 Apple iOS18 にアップグレードする必要がありますが、Apple iOS18 の最新リリースにはどのようなバグがありますか?実際の使用評価の後、以下に Apple iOS 18 のバグの概要を示しますので、見てみましょう。現在、多くのiPhoneユーザーがiOS18へのアップグレードを急いでいますが、さまざまなシステムバグが人々を不快にさせています。一部のブロガーは、「バグが非常に多い」ため、iOS18にアップグレードする場合は注意する必要があると述べています。ブロガーは、あなたのiPhoneが

See all articles