c++ dll发送utf8作为const char*, c#需要做…什么

C++ dll sends utf8 as const char*, c# needs to do... what?

本文关键字:什么 发送 dll utf8 作为 char const c++      更新时间:2023-10-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格式,你应该手工转换。所有默认转换都不适合您的问题。