gpt4 book ai didi

c# - 将非托管 unicode 字符串编码到 .net。高字符替换为问号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:42 24 4
gpt4 key购买 nike

这可能是也可能不是 SWIG 问题。

我正在尝试按值从 C++ 函数返回一个 std::wstring 到 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++ 调用程序,您就可以看到调试器中的指针看起来是一个带有 ?里面有记号。因此,似乎 .net 在返回给调用者之前对字符串执行了某种转换。听起来对吗?我该如何控制它?

编辑 2:看来我需要对返回类型 CreateWString 执行 MarshallAs 以阻止 .net 转换为 TCHAR 类型(?)

最佳答案

CreateWString 定义修改为:

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

请参阅 MarshalAsAttribute 中的示例文档。

关于c# - 将非托管 unicode 字符串编码到 .net。高字符替换为问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7762266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com