System::String转换为std::string


此文为转载文章

作者:Kyle的博客

连接:http://blog.sina.com.cn/s/blog_695abcf70100m6ac.html


    当使用C++/CLI包装C++本地代码时,常常需要将System::String转换为std::string或者char*以调用native C++函数。.net环境中的字符串是unicode的,占2个字节,而很多native C++函数都没有考虑unicode,这种转换不仅仅是2字节转1字节,同时也涉及到字符集的转换。

    在有些文档中提到用wcstombs进行宽字符到多字符的转换,但是经过试验,这种方式在C++/CLI代码中处理中文时会失败。在System::Runtime::InteropServices名字空间里的Marshal类提供了另外一种方式(StringToHGlobalAnsi)进行这种转换,msdn中说道:“将托管 String 中的内容复制到非托管内存,并在复制时转换为 ANSI 格式。StringToHGlobalAnsi 对于自定义封送处理或者在混合托管和非托管代码时很有用。由于该方法分配字符串所需的非托管内存,因此应始终通过调用 FreeHGlobal 释放内存。StringToHGlobalAnsi 提供与 Marshal.PtrToStringAnsi 相反的功能。”

void ConvertToString(System::String^ str, std::string& text)
{
     char* p = (char*)(int)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
     text = p;
     System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)p);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值