将非托管unicode字符串编组到.net.高字符替换为问号

本文关键字:字符 替换 高字符 net unicode 字符串 | 更新日期: 2023-09-27 18:11:08

这可能是一个SWIG问题,也可能不是。

我试图返回一个std::wstring值从c++函数到c#。返回的字符串混合了普通的古英语字符和希伯来语字符。英文字符正常通过,但希伯来语字符在某个地方被转换为问号符号。

我使用SWIG来生成编组代码。使用调试器逐步完成所有操作,得到以下SWIG代码…

static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString) {
    string str = System.Runtime.InteropServices.Marshal.PtrToStringUni(cString);
    return str;
}

现在str看起来很完美。

接下来,它被返回到swig生成的c++代码中,该代码将str作为void*返回。

然后void*在调用代码中再次变成。net字符串。在呼叫代码中,所有的希伯来字母都是什么?马克。

你知道这是什么原因吗?

编辑:

进一步信息

一旦CreateWString返回到c++调用者,你可以看到调试器中的指针看起来是一个ANSI字符串?里面有记号。因此,似乎。net在字符串返回给调用者之前正在执行某种转换。听起来对吗?我怎么能控制呢?

编辑2:似乎我需要在返回类型CreateWString上做MarshallAs,以阻止。net转换为TCHAR类型(?)

将非托管unicode字符串编组到.net.高字符替换为问号

修改CreateWString定义为:

[return: MarshalAs(UnmanagedType.LPWStr)]
static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString)

查看MarshalAsAttribute文档中的示例