C#プロジェクト(.Net Framework 4)で古いC++ライブラリを使用する必要があります。C#のネイティブC++ライブラリへのCLIへの1256エンコーディングの文字列の受け渡し
一般的に私はすべての設定を行い、実行していますが、文字列値をライブラリに渡すことは私にとって問題を引き起こしています。
アラビア文字を含むutf-8に文字列値を受け取ります。 ライブラリはiso-1256エンコーディングでアラビア文字を処理しています。
私が何をしようとしても、私はいつもちょうど一束になるのですか?ライブラリにアラビア文字列を渡すときはいつでも。
私のアプローチは、C#コードでutf-8でエンコードされた文字列をiso-1256に変換し、その結果をC++ライブラリに渡すことです。
C#での変換は、次のようになります。
var bytes = encUtf8.GetBytes((string)value);
String value1256 = enc1256.GetString(Encoding.Convert(encUtf8, enc1256, bytes));
私は、ライブラリにvalue1256渡す進みます。
呼び出されるCLI関数は、String^sValパラメータを受け入れます。 レガシーコードは内部的にCStringを使用しているので、文字列を変換する必要があります。ここでは問題があります。 どのように文字列を変換しても、私はちょうど???と結婚しています。
これまでに試した変換の一覧を示します。すべて同じ結果が得られます。
pin_ptr<const wchar_t> wch = PtrToStringChars(sVal);
CString cstring6(wch);
wchar_t* A= (wchar_t*)(Marshal::StringToHGlobalAnsi(sVal).ToPointer());
std::string stdString = marshal_as<std::string>(sVal);
CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>> cStringT = CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>(sVal);
CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>> cStringT2 = CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>(A);
CString cString1 = CString(sVal);
CString cString2 = CString(stdString.c_str());
CString cString3 = stdString.c_str();
CString cString4 = CString(_T(stdString.c_str()));
CString cString5 = CString(sVal);
marshal_context^ context = gcnew marshal_context();
const char* c_s = context->marshal_as<const char*>(sVal);
は明らかに私がここで何か間違ったことをやっている:私は、デバッガをチェックすると、元のSVALは、アラビア文字が、ちょうど???に結果の下にリストされているすべての単一の変換のために正しく表示されます。 親切にして、私にここで正しい方向を教えてください。
最後の要素として文字列ターミネータ( '\ 0')を使用してchar配列を渡してみましたか? – tinstaafl