C#からc++のコードを呼び出し、文字列を取得する処理を実装しています。
返却して受け取りたい文字コードはUnicode形式です。
その際、C#で定義したStringBuilderに格納される文字が文字化けしてしまいます。
何が原因と考えられますでしょうか?
C++とのインタフェース
C#
1 2 3 [DllImport(DllName, EntryPoint = "CppCode", CharSet =CharSet.Unicode)] 4 [return: MarshalAs(UnmanagedType.LPWStr)] 5 internal static extern void TestCode(safeHandle ptr, [Out,MarshalAs(UnmanagedType.LPWStr)]StringBuilder str);
上記コードの呼び出し元
このコードのsbの値が文字化けします。
C#
1sb = new StringBuilder("",1500); 2TestCode(ptr, sb); 3
stringを返却するC++コード
C++
1extern "C" void CppCode(wchar_t **str) 2{ 3 std::string text = "ABCDEFG"; 4 *str= new wchar_t[text.length() + 1]; 5 mbstowcs(*str, text.c_str(), text.length()+1); 6}
どういうふうに文字化けするんでしょう
C++の処理を通すと、StringBuilderの変数に以下のような文字化けが発生します。
C++コード側をデバッグしてみたところ、正しい文字列が格納されていることは確認できました。
■文字化け
컜敶獲潩㵮ㄢ〮•湥潣楤杮∽瑵ⵦ∸㰾癳敶獲潩≮⸱∰瘠敩䉷硯∽‰‰⸸〶
■正しい文字列
<?xml version=\"1.0\" encoding=\"utf-8\"><svg versio...
パターン的は『ファイルの文字コードが違う』系かなぁ。
Unicode文字列なので、UnmanagedType.LPWStrでC#側で宣言してC++側ではwchar_tで扱っているんですけどね。。。なぜでしょうかね。
C#側でバッファを確保してLPWStr(wchar_t*)を渡してるのに、C++側がwchar_t **でいいんですか?引数も2つから1つになってるし、色々おかしいです。
@ 質問者さん
> Unicode文字列なので、
私が言ってるのはその意味というより、ファイル自体のです。
OSが明記されていないのでわかりませんが、Windowsだと https://win10labo.info/win10-notepad-char-code/ のようなやつの方です。
@BeatStarさん
文字列は内部で生成しているだけなので、ファイルの読み込みなどは行っていないのですが、そういう意味の指摘では無いでしょうか?
回答1件
あなたの回答
tips
プレビュー