質問のタイトルは基本的に私が聞きたいものです:
[MarshalAs(UnmanagedType.LPStr)]
-これはどのようにしてutf-8文字列をchar*に変換しますか?
c#とc ++ dllの間で通信しようとするときは、上記の行を使用します。より具体的には、
somefunction(char *string) [c++ dll]
somefunction([MarshalAs(UnmanagedType.LPStr) string text) [c#]
utf-8テキスト(scintilla.Text)をc#を介してc ++ dllに送信すると、VS10デバッガーに次のように表示されます。
c#文字列は正常に変換されました
char*
結果
char*
は、ウォッチウィンドウの対応するutf-8文字(韓国語のビットを含む)を適切に反映します。
これがスクリーンショットです(詳細を含む):
ご覧のとおりinitialScriptText[0]
、シングルbyte(char)
:'B'を返し、の内容が char* initialScriptText
VSウォッチウィンドウに正しく表示されます(韓国語を含む)。
ポインタchar
を見ると、英語は1バイトbyte
あたりchar
1バイトとして保存されているようですが、韓国語は1バイトあたり2バイトとして保存されているようchar
です。(スクリーンショットの韓国語は3文字なので、6バイトで保存されます)
これは、各「文字」が同じサイズのコンテナに保存されていないことを示しているようですが、言語によって異なります。(タイプに関するヒントの可能性はありますか?)
純粋なC++で同じ結果を達成しようとしています。つまり、utf-8ファイルを読み込んで、結果を。として保存しますchar*
。
char*
utf-8ファイルを読み取ってC++で変換しようとした例を次に示します。
観察:
wchar_t*
からに変換するときの視覚の損失char*
wchar_t*
結果として、s8は文字列を正しく表示するので、utf-8ファイルの内容をに正常に変換したことがわかります。char*
- 'result'はファイルから直接取得したバイトを保持しますが、c#で取得した結果とは異なる結果を取得しているため(同じファイルを使用しました)、c#マーシャルが出力したと結論付けました。テキストをさらにに変更するためのその他の手順によるファイルの内容
char*
。
(スクリーンショットは、wcstombsの使用における私のひどい失敗も示しています)
注:(http://utfcpp.sourceforge.net/)のutf8ヘッダーを使用しています
私のコード/観察の間違いについて私を訂正してください。
私はc#マーシャルを通過した結果を模倣できるようにしたいと思っています。これらすべてを実行した後、私は完全に立ち往生していることに気付きました。何か案は?