2016-11-09 12 views
-1

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

最後の要素として文字列ターミネータ( '\ 0')を使用してchar配列を渡してみましたか? – tinstaafl

答えて

2

String^オブジェクトを持っている場合、可能なエンコーディングはUTF-16のみです。明示的に別のエンコーディングを渡すには、文字列ではなくバイト配列である必要があります。

enc1256.GetString(Encoding.Convert(encUtf8, enc1256, bytes)); 

あなたはこの行に近いですが、それほどではありません。あなたはUTF-8をbytesにエンコードし、1256エンコードバイト配列に変換しますが、それをUTF-16 String^(悪い)に変換し直しています。 (value1256とオリジナルのvalueを見ると、それらはおそらくまったく同じです)。その後、さまざまな文字列への変換をすべて行うと、それらはすべてUTF-16から新しい変換を行います。おそらくすべてASCIIまたはデフォルト1252コードページに変換されます。

Encoding::GetBytes(String^)を呼び出して、そのバイト配列をアンマネージC++ライブラリに渡します。 (UTF-8による迂回は不要です。)エンコーディングに切り替えた後は、文字列ではなくバイト配列と考えるようにしてください。 (私は、管理されているか管理されていない文字列クラスを使用することを躊躇しています)

GetBytesはC#またはC++/CLIのいずれかで呼び出すことができますが、C++/CLIを使用します。呼び出し元に適切なエンコーディングがわかるようにするのではなく、C#&がC#String^のタイプを使用することを確認してください。

関連する問題