Swig変換C++インタフェース中国語文字化け解決方案


以前、文章で共有した中国語の文字化けしの解決策はlibiconvライブラリを借りたもので、結局第三者のライブラリで、私はすでにバージョンをコンパイルして直接使用することができますが、ある友达はいろいろな問題に直面しています.この共有C++11に付属するバイトコード変換ライブラリは、これを使用してlibiconvライブラリを蹴ることができます.Linuxの下でg++は5.0以上のバージョンが必要です.そうしないと、関数が見つからないと報告されます.
方法は簡単で、文章の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を生成し、コンパイルすればよい.