c++ dll发送utf8作为const char*, c#需要做…什么
C++ dll sends utf8 as const char*, c# needs to do... what?
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格式,你应该手工转换。所有默认转换都不适合您的问题。
相关文章:
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 当我将 char 数组发送到输入参数为字符串的函数时会发生什么?
- 在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
- HTTPADDREQUESTHEADERS添加的标头与HttpsendRequest发送的标题有什么区别
- 有什么方法可以通过按下按钮将HTTP请求从JS发送到C
- 什么是通过MPI发送OpenCV垫的最佳方法
- 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?
- 通过插座发送的内容的数据类型是什么
- 计算差异数据并通过网络发送的最佳方式是什么
- 我应该按什么顺序发送callback()并通知服务员?
- C++ 在发送什么参数方面遇到问题
- 在C 中将数据从一个线程发送到另一个线程的最快方法是什么?
- 了解发送方对象类型的最佳方法是什么
- 问:如果你发送信号太快会发生什么
- 是什么原因导致Windows发送ID_HELP命令两次
- 有什么方法可以在 tbb::flow::graph 中的节点之间发送"heavy"类型?
- 我怎么知道要发送什么到串口
- 如果输入流被发送到输出流会发生什么?
- QListView在即将隐藏时发送什么信号