将非托管unicode字符串编组到.net.高字符替换为问号
Marshalling unmanaged unicode string to .net. High chars replaced with question marks
这可能是一个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类型(?)
修改CreateWString
定义为:
[return: MarshalAs(UnmanagedType.LPWStr)]
static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString)
查看MarshalAsAttribute文档中的示例
相关文章:
- 生成随机.txt文件,10行,10列。充满随机:"*"、"#"、"@"。然后将随机字符替换为'P'
- 我想仅使用递归将字符"a"替换为字符"z"
- 将一个字符替换为字符串中更多数量的字符,而不删除C++中的其他字母
- 如何将像'A'这样的单个字符替换为类似"10"?
- Qt:文件名中的非 ASCII 字符替换为"?"
- 我无法用字符替换重复的数字"a"
- QtLineEdit 占位符:如何让用户在插入模式下将字符 1 替换为 1
- 将一个特定字符替换为正则表达式匹配中的另一个字符
- 如何将所有出现的字符替换为给定的字符串
- 将一个数组到另一个数组的字符替换为字符串
- C++ 字符串,用于删除字符'b'并将字符'a'替换为两个'd'的构建函数
- 将字符串中的所有非 ASCII 字符替换为其等效的 ASCII
- 将utf8编码的字符串转换为本地8位编码的字符串,并将无法确定的字符替换为空白
- C++-用非ascii字符替换文件中的特殊字符
- 将字符串中的 č,š,ć 等字符替换为其 html 代码C++
- 用连字符替换字符串中的文本
- 用不同字符替换单词的代码
- 将空白字符替换为 %20 的字符串,忽略所有尾随空格
- 将部分字符*替换为较小的字符*
- 将字符串中的字符替换为某个字符串