Swig変換C++インタフェース中国語文字化け解決方案
以前、文章で共有した中国語の文字化けしの解決策はlibiconvライブラリを借りたもので、結局第三者のライブラリで、私はすでにバージョンをコンパイルして直接使用することができますが、ある友达はいろいろな問題に直面しています.この共有C++11に付属するバイトコード変換ライブラリは、これを使用してlibiconvライブラリを蹴ることができます.Linuxの下でg++は5.0以上のバージョンが必要です.そうしないと、関数が見つからないと報告されます.
方法は簡単で、文章のiファイルを以下のように変更するだけでいいです.
その後、元の手順に従って、swigはwrap fileを生成し、コンパイルすればよい.
方法は簡単で、文章のiファイルを以下のように変更するだけでいいです.
%module(directors="1") thosttraderapi
%{
#include "ThostFtdcTraderApi.h"
#include
#include
#include
#include
using namespace std;
#ifdef _MSC_VER
const static locale g_loc("zh-CN");
#else
const static locale g_loc("zh_CN.GB18030");
#endif
%}
%typemap(out) char[ANY], char[] {
const std::string &gb2312($1);
std::vector wstr(gb2312.size());
wchar_t* wstrEnd = nullptr;
const char* gbEnd = nullptr;
mbstate_t state = {};
int res = use_facet >
(g_loc).in(state,
gb2312.data(), gb2312.data() + gb2312.size(), gbEnd,
wstr.data(), wstr.data() + wstr.size(), wstrEnd);
if (codecvt_base::ok == res)
{
wstring_convert> cutf8;
std::string result = cutf8.to_bytes(wstring(wstr.data(), wstrEnd));
resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size());
}
else
{
std::string result;
resultobj = SWIG_FromCharPtrAndSize(result.c_str(), result.size());
}
}
%feature("director") CThostFtdcTraderSpi;
%ignore THOST_FTDC_VTC_BankBankToFuture;
%ignore THOST_FTDC_VTC_BankFutureToBank;
%ignore THOST_FTDC_VTC_FutureBankToFuture;
%ignore THOST_FTDC_VTC_FutureFutureToBank;
%ignore THOST_FTDC_FTC_BankLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BrokerLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BankLaunchBrokerToBank;
%ignore THOST_FTDC_FTC_BrokerLaunchBrokerToBank;
%feature("director") CThostFtdcTraderSpi;
%include "ThostFtdcUserApiDataType.h"
%include "ThostFtdcUserApiStruct.h"
%include "ThostFtdcTraderApi.h"
その後、元の手順に従って、swigはwrap fileを生成し、コンパイルすればよい.