No2:luacom中文内容输出BUG及修正
使 用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>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Call of Duty Warzone ialah permainan mudah alih yang baru dilancarkan Ramai pemain sangat ingin tahu tentang cara menetapkan bahasa permainan ini kepada bahasa Cina Malah, ia adalah sangat mudah ubah suai selepas menggunakannya. Kandungan terperinci boleh dipelajari dalam pengenalan kaedah tetapan bahasa Cina ini. Mari kita lihat bersama. Cara menetapkan bahasa Cina untuk permainan mudah alih Call of Duty: Warzone 1. Mula-mula masukkan permainan dan klik ikon tetapan di penjuru kanan sebelah atas antara muka. 2. Dalam bar menu yang muncul, cari pilihan [Muat Turun] dan klik padanya. 3. Pilih [SIMPLIFIEDCHINESE] (Simplified Chinese) pada halaman ini untuk memuat turun pakej pemasangan Chinese Simplified. 4. Kembali ke tetapan

Persediaan VSCode dalam Bahasa Cina: Panduan Lengkap Dalam pembangunan perisian, Visual Studio Code (VSCode ringkasnya) ialah persekitaran pembangunan bersepadu yang biasa digunakan. Bagi pembangun yang menggunakan bahasa Cina, menetapkan VSCode kepada antara muka Cina boleh meningkatkan kecekapan kerja. Artikel ini akan memberi anda panduan lengkap, memperincikan cara menetapkan VSCode kepada antara muka Cina dan menyediakan contoh kod khusus. Langkah 1: Muat turun dan pasang pek bahasa Selepas membuka VSCode, klik di sebelah kiri

Bagaimana untuk memaparkan aksara Cina dengan betul dalam PHPDompdf Apabila menggunakan PHPDompdf untuk menjana fail PDF, adalah cabaran biasa untuk menghadapi masalah aksara Cina yang kacau-bilau. Ini kerana pustaka fon yang digunakan oleh Dompdf secara lalai tidak mengandungi set aksara Cina. Untuk memaparkan aksara Cina dengan betul, kita perlu menetapkan fon Dompdf secara manual dan pastikan untuk memilih fon yang menyokong aksara Cina. Berikut ialah beberapa langkah dan contoh kod khusus untuk menyelesaikan masalah ini: Langkah 1: Muat turun fail fon Cina Pertama, kita perlukan

Hamparan Excel adalah salah satu perisian pejabat yang ramai orang gunakan sekarang, kerana komputer mereka adalah sistem Win11, jadi antara muka bahasa Inggeris dipaparkan itu. Untuk menyelesaikan masalah ini, isu ini Editor berada di sini untuk menjawab soalan untuk semua pengguna Mari lihat kandungan yang dikongsi dalam tutorial perisian hari ini. Tutorial untuk menukar Excel kepada bahasa Cina: 1. Masukkan perisian dan klik pilihan "Fail" di sebelah kiri bar alat di bahagian atas halaman. 2. Pilih "pilihan" daripada pilihan yang diberikan di bawah. 3. Selepas memasuki antara muka baharu, klik pilihan "bahasa" di sebelah kiri

Tajuk: Cara berkesan untuk membaiki aksara Cina yang kacau dalam PHPDompdf Apabila menggunakan PHPDompdf untuk menjana dokumen PDF, aksara Cina yang kacau adalah masalah biasa. Masalah ini biasanya berpunca daripada fakta bahawa Dompdf tidak menyokong set aksara Cina secara lalai, menyebabkan kandungan Cina tidak dipaparkan dengan betul. Untuk menyelesaikan masalah ini, kita perlu mengambil beberapa cara yang berkesan untuk menyelesaikan masalah PHPDompdf Cina yang kacau. 1. Gunakan fail fon tersuai Cara yang berkesan untuk menyelesaikan masalah aksara Cina yang kacau dalam Dompdf adalah dengan menggunakan

Bagaimana untuk menukar halaman yang membuka pelayar Microsoft Edge kepada navigasi 360 Ia sebenarnya sangat mudah, jadi sekarang saya akan berkongsi dengan anda kaedah menukar halaman yang membuka pelayar Microsoft Edge kepada 360 navigasi Rakan-rakan yang memerlukan lihat. Saya harap dapat membantu semua orang. Buka penyemak imbas Microsoft Edge. Kami melihat halaman seperti di bawah. Klik pada ikon tiga titik di sudut kanan atas. Klik "Tetapan." Klik "Pada permulaan" dalam lajur kiri halaman tetapan. Klik pada tiga titik yang ditunjukkan dalam gambar di lajur kanan (jangan klik "Buka Tab Baharu"), kemudian klik Edit dan tukar URL kepada "0" (atau nombor lain yang tidak bermakna). Kemudian klik "Simpan". Seterusnya, pilih "

"WWE2K24" ialah permainan sukan lumba yang dicipta oleh Visual Concepts dan dikeluarkan secara rasmi pada 9 Mac 2024. Permainan ini sangat dipuji, dan ramai pemain sangat berminat sama ada ia akan mempunyai versi Cina. Malangnya, setakat ini, "WWE2K24" masih belum melancarkan versi bahasa Cina. Adakah wwe2k24 dalam bahasa Cina Jawapan: Bahasa Cina tidak disokong pada masa ini. Versi standard WWE2K24 di rantau Steam China berharga 199 yuan, versi deluxe ialah 329 yuan, dan edisi peringatan ialah 395 yuan. Permainan ini mempunyai keperluan konfigurasi yang agak tinggi, dan terdapat piawaian tertentu dari segi pemproses, kad grafik atau memori berjalan. Konfigurasi yang disyorkan rasmi dan pengenalan konfigurasi minimum:

Memandangkan persidangan WWDC Apple 2024 mencapai kesimpulan yang berjaya, bukan sahaja macos15 diumumkan, tetapi kemas kini sistem iOS18 baharu Apple paling menarik perhatian Walaupun terdapat banyak ciri baharu, sebagai versi pertama iOS18 Apple, orang ramai pasti tertanya-tanya sama ada ia adalah perlu untuk menaik taraf Apple iOS18, apakah jenis pepijat yang terdapat dalam keluaran terbaru Apple iOS18? Selepas penilaian penggunaan sebenar, berikut ialah ringkasan pepijat Apple iOS18, mari kita lihat. Pada masa ini, ramai pengguna iPhone tergesa-gesa untuk menaik taraf kepada iOS18 Namun, pelbagai pepijat sistem menyebabkan orang tidak selesa. Sesetengah penulis blog berkata bahawa anda harus berhati-hati semasa menaik taraf kepada iOS18 kerana "terdapat banyak pepijat." Blogger itu berkata bahawa jika iPhone anda adalah
