源:http://www.cnblogs.com/zhcncn/archive/2013/05/20/3089084.html

1. char*->string

(1)直接转换

const char* nodename;
string temp = nodename;
string temp2(nodename);

2. wchar_t*->wstring

(1)直接转换

const wchar_t* nodename;
wstring temp = nodename;
wstring temp2(nodename);

3. string->char*

   wstring->char*

方法一:

(1)将wstring.c_str()转为wchar_t*

方法二:

(1)将string.c_str(), wstring.c_str()转为AnsiString(http://blog.csdn.net/bannico/article/details/7577728),

(2)将AnsiString.c_str()转为char*

方法一:
string temp;
const char* nodename = temp.c_str();
方法二:
struct IPAddress{
std::wstring hostname;
std::vector<std::wstring> ips;
}; scripting::IPAddress dns = (*pPreloadDns)[i];
AnsiString strA = dns.hostname.c_str();
char * hn = strA.c_str();

但据说这样很不可靠(http://bbs.csdn.net/topics/30479944),安全的做法是:

方法三: String str="123456";
int len=str.Length();
char *cp=new char[len+1];
StrPCopy(cp, str);

4. wstring->wchar_t*

    string->w_char*(参见5)

方法一:

(1)将wstring.c_str()转为wchar_t*

方法二.一:

(1)将wstring.c_str()转为UnicodeString

(2)将UnicodeString.c_str()转为wchar_t*

方法二.二:

(1)将wstring.c_str()转为AnsiString

(2)使用ANSIToUnicode方法将AnsiString.c_str()转为wchar_t*

方法一:
wstring temp;
wchar_t* nodename = temp.c_str();
方法二.一:
struct IPAddress{
std::wstring hostname;
std::vector<std::wstring> ips;
}; scripting::IPAddress dns = (*pPreloadDns)[i];
UnicodeString strA = dns.hostname.c_str();
//char * hn = strA.c_str();
wchar_t * hn = strA.c_str(); 方法二.二:
struct IPAddress{
std::wstring hostname;
std::vector<std::wstring> ips;
}; scripting::IPAddress dns = (*pPreloadDns)[i];
AnsiString strA = dns.hostname.c_str();
//char * hn = strA.c_str();
wchar_t * hn = ANSIToUnicode(strA.c_str());

5. char*->UnicodeString->wstring, wchar_t*

(1)将char*转为UnicodeString

(2)将UnicodeString.c_str()转为wstring, wchar_t*

UnicodeString temp(inet_ntoa(pAddr->sin_addr)) ; //inet_ntoa returns char* std::wstring addr(temp.c_str()); wchar_t* addr2 = temp.c_str(); log_debug(_T("set connection ip:") << addr); con->setIP(addr);

6. wchar_t*->AnsiString->string, char*

(1)将wchar_t*转为AnsiString

(2)将AnsiString.c_str()转为string, char*

wchar_t* str = wstring.c_str(); AnsiString temp(str ) ; //inet_ntoa returns char*
std::string addr(temp.c_str()); char* addr2 = temp.c_str(); log_debug(_T("set connection ip:") << addr); con->setIP(addr);

下面关于string,wstring互转的方法是错误的。对ansi字符可能能得到正确结果,但如果传入的参数是“中文”字符串,将得不到正确的结果。

 7. string->wstring

static wstring Str2Wstr (string str )
{
if (str.length() == )
return L""; std::wstring wstr;
wstr.assign (str.begin(), str.end());
return wstr;
}

8. wstring->string

static string Wstr2Str(wstring wstr )
{
if (wstr.length() == )
return ""; std::string str;
str.assign (wstr.begin(), wstr.end());
return str;
}

正确的做法是使用MultiByteToWideChar和WideCharToMultiByte:

9. string->wstring

std::wstring stringToWstring(const std::string& str)
{
LPCSTR pszSrc = str.c_str();
int nLen = MultiByteToWideChar(CP_ACP, , pszSrc, -, NULL, );
if (nLen == )
return std::wstring(L""); wchar_t* pwszDst = new wchar_t[nLen];
if (!pwszDst)
return std::wstring(L""); MultiByteToWideChar(CP_ACP, , pszSrc, -, pwszDst, nLen);
std::wstring wstr(pwszDst);
delete[] pwszDst;
pwszDst = NULL; return wstr;
}

10. wstring->string

std::string wstringToString(const std::wstring& wstr)
{
LPCWSTR pwszSrc = wstr.c_str();
int nLen = WideCharToMultiByte(CP_ACP, , pwszSrc, -, NULL, , NULL, NULL);
if (nLen == )
return std::string(""); char* pszDst = new char[nLen];
if (!pszDst)
return std::string(""); WideCharToMultiByte(CP_ACP, , pwszSrc, -, pszDst, nLen, NULL, NULL);
std::string str(pszDst);
delete[] pszDst;
pszDst = NULL; return str;
}

测试代码:

int _tmain(int argc, _TCHAR* argv[])
{
std::string str = "中文";
std::wstring wstr = L"中文";
std::string str1 = "";
std::wstring wstr1 = L"";
LPCSTR pSrc = "中文";
LPCWSTR pwzSrc = L"中文"; stringToWstring(str);
wstringToString(wstr);
stringToWstring(str1);
wstringToString(wstr1);
stringToWstring(pSrc);
wstringToString(pwzSrc); return ;
}

C++ Builder string相互转换(转)的更多相关文章

  1. c#中 uint--byte[]--char[]--string相互转换汇总

    原文:c#中 uint--byte[]--char[]--string相互转换汇总 在在做一些互操作的时候往往需要一些类型的相互转换,比如用c#访问win32api的时候往往需要向api中传入DWOR ...

  2. java中的BigDecimal和String的相互转换,int和String的类型转换,Integer类和String相互转换

    一: /*由数字字符串构造BigDecimal的方法 *设置BigDecimal的小数位数的方法 */ 注:BigDecimal在数据库中存的是number类型. import java.math.B ...

  3. json对象与string相互转换教程

    一.说明 1.1 背景说明 json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了.但今天又被string转json对象折腾了半天,实在受不了,所以还是 ...

  4. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  5. golang []byte 和 string相互转换

    原文链接:golang []byte和string相互转换 测试例子 package main import ( "fmt" ) func main() { str2 := &qu ...

  6. Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.

    1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...

  7. xml string 相互转换

    一.使用最原始的javax.xml.parsers,标准的jdk api // 字符串转XMLString xmlStr = /"....../";StringReader sr ...

  8. C++Builder String 转 char* (转)

    源:http://blog.csdn.net/bannico/article/details/7577728 使用C++ Builder 处理字符串经常会遇到兼容性问题. 这次要将String 类型 ...

  9. java - Integer、int 、String相互转换总结

    一下子还真记不清这三种数据类型之间的转换方法,所以做个小笔记. public class Test03 { public static void main(String[] args) { //int ...

随机推荐

  1. 转:jmeter之线程组

    虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的.之前的版本只有一个线程组的名字.现在多一个setUp theread Group 与terDown Thread Group 1 ...

  2. YII 常用路径总结

      Yii framework已经定义的命名空间常量 system: 指向Yii框架目录; YII\framework zii: 指向zii library 目录; YII\framework\zii ...

  3. php 上传缩放图片

    有时上传图片时因为图片太大了,不仅占用空间,消耗流量,而且影响浏(图片的尺寸大小不一).下面分享一种等比例不失真缩放图片的方法,这样,不管上传的图片尺有多大,都会自动压缩到我们设置尺寸值的范围之内.经 ...

  4. KMP算法类习题——字符串匹配

    Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p- ...

  5. 1305: Substring

    #include <iostream>#include<string.h>#include<stdio.h> using namespace std; #defin ...

  6. jquery checkbox 操作

    1.jquery 获取所有选中和未选中的checkbox 未选中 var unCheckedBoxs = $("input[name='myCheckbox']").not(&qu ...

  7. 关于微信分享功能开发的一些bug

    wx.onMenuShareTimeline({//onMenuShareTimeline title: (h('#mainForm').children('.content').inf('value ...

  8. wpa_supplicant_8_ti hostapd wpa_supplicant TI 官方的wpa_supplicant hostapd 移植到linux

    在移植 wpa_supplicant_8_ti 的时候碰到很多头文件找不到.然后参考了下面的博客 http://blog.csdn.net/penglijiang/article/details/85 ...

  9. Android:SQLite无法update/insert/delete数据(数据库被locked)

    //在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常. mDatabase.beginTransaction(); try { Log.v(TAG,"locked: ...

  10. ref与out之间的区别整理 摘自与望楼http://blog.csdn.net/xiaoning8201/article/details/6893154

    ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递. 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别. 总结起来,他们有如下语法区别: .ref ...