c++ dll发送utf8作为const char*, c#需要做…什么
本文关键字:什么 发送 dll utf8 作为 char const c++ | 更新日期: 2023-09-27 18:16:16
dll用c++编写,通过const char*
回调发送utf8文本。
首先,这是声明回调的正确方法吗?
[UnmanagedFunctionPointer( CallingConvention.StdCall )]
public delegate void TextCallback( string sText );
[DllImport(
"cppLib.dll",
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl )]
public static extern void GetText(
[MarshalAs( UnmanagedType.FunctionPtr )] TextCallback textCallback );
private TextCallback m_TextCallback;
本地回调:
typedef void ( __stdcall * TextCallback )( const char* szText );
如果是,我如何处理utf8文本一旦它到达?
我把它发送到一个RichTextBox和utf8字符出来作为垃圾(那些碰巧是ascii打印好的)。
谢谢大家。
在下面的评论中,TheUndeadFish提供了一个链接,上面有一个可行的答案。它也在一定程度上得到了解释。感兴趣的应该看看。我只是在这里复制答案,因为它适用于我发布的代码。
只需要修改:
[UnmanagedFunctionPointer( CallingConvention.StdCall )]
public delegate void TextCallback( IntPtr ipText );
委托重新解释int指针(指向c++ dll中的utf8字符串)如下:
m_TextCallback = ( ipText ) =>
{
var data = new System.Collections.Generic.List<byte>();
var off = 0;
while( true )
{
var ch = Marshal.ReadByte( ipText, off++ );
if( ch == 0 )
{
break;
}
data.Add( ch );
}
string sptr = Encoding.UTF8.GetString( data.ToArray() );
};
您应该使用CharSet。Unicode(如果字符串是wchar*,每个字符2字节)或CharSet。Ansi(如果字符串每个字符是1字节)
因为你的字符串是UTF8格式,你应该手工转换。所有默认转换都不适合您的问题。