C#回调接收UTF8字符串

我有一个C#函数,一个回调,从用C ++编写的Win32 DLL调用。 调用者给了我一个UTF8字符串,但是我无法正确接收它,所有匈牙利语特殊字符都出错了。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int func_writeLog(string s); 

当我将参数类型更改为IntPtr并编写代码时,它会正确写入。 但我发现这是一个非常缓慢的解决方案:

  byte[] bb = new byte[1000]; int i = 0; while (true) { byte b = Marshal.ReadByte(pstr, i); bb[i] = b; if (b == 0) break; i++; } System.Text.UTF8Encoding encodin = new System.Text.UTF8Encoding(); var sd = encodin.GetString(bb, 0, i); 

我试着给string参数写一些属性,比如:

  [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int func_writeLog([In, MarshalAs(UnmanagedType.LPTStr)] string s); 

没有人工作。 有什么建议吗? 提前致谢!

在纯托管代码中没有很好的方法可以快速执行此操作,它总是需要复制字符串,这非常尴尬,因为您不知道所需的缓冲区大小。 你想要为你做一个Windows函数,MultiByteToWideChar()是work-horse转换器函数。 像这样用它:

 using System.Text; using System.Runtime.InteropServices; ... public static string Utf8PtrToString(IntPtr utf8) { int len = MultiByteToWideChar(65001, 0, utf8, -1, null, 0); if (len == 0) throw new System.ComponentModel.Win32Exception(); var buf = new StringBuilder(len); len = MultiByteToWideChar(65001, 0, utf8, -1, buf, len); return buf.ToString(); } [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int MultiByteToWideChar(int codepage, int flags, IntPtr utf8, int utf8len, StringBuilder buffer, int buflen);