标签: stringwstringwchar_tcharc++
2013-12-19 00:29 3721人阅读 评论(0) 收藏 举报
本文章已收录于: C++知识库
分类: C/C++(50)
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() == 0)
return L"";

std::wstring wstr;
wstr.assign (str.begin(), str.end());
return wstr;
}

8. wstring->string

static string Wstr2Str(wstring wstr )
{
if (wstr.length() == 0)
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, 0, pszSrc, -1, NULL, 0);
if (nLen == 0)
return std::wstring(L"");

wchar_t* pwszDst = new wchar_t[nLen];
if (!pwszDst)
return std::wstring(L"");

MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, 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, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
if (nLen == 0)
return std::string("");

char* pszDst = new char[nLen];
if (!pszDst)
return std::string("");

WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, 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 0;
}

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

C++ wstring string char* wchar_t相互转换的更多相关文章

  1. QString, Std::string, char *相互转换

    Qt 库中对字符串类型进行了封装,QString 类提供了所有字符串操作方法,给开发带来了便利. 由于第三方库的类型基本上都是标准的类型,即使用std::string或char *来表示字符 (串) ...

  2. 彻底搞定char/wchar_t/unicode

    彻底搞定char/wchar_t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (2013-07-17 10:18:28) 转载▼     从char/wchar_t到TCHAR(1) ...

  3. char*,wchar_t*,CString和BSTR之间的转换

    前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法. 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const ...

  4. char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

    转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...

  5. 【转】CString,string,char*综合比较

    (一)  概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CString ...

  6. mfc CString,string,char* 之间的转换

    知识点: CString转char*,string string转char*,CString char* 转CString,string 一.CString转char*,string //字串转换测试 ...

  7. (转)CString,int,string,char*之间的转换

    CString,int,string,char*之间的转换http://www.cnblogs.com/greatverve/archive/2010/11/10/cstring-int-string ...

  8. C++string,char* 字符数组,int类型之间的转换

    string.int 常见类型之间相互转换 int & string 之间的转换 C++中更多的是使用流对象来实现类型转换 针对流对象 sstream实现 int,float 类型都可以实现 ...

  9. C++中int,float,string,char*的转换(待续)

    //float转string char a[100]; float b = 1.234; sprintf(a, "%f", b); string result(a); //int转 ...

随机推荐

  1. Struts2学习笔记(一):Struts2开发环境的配置

    一.Struts2应用所需的jar文件. 开发struts2应用需要依赖的jar文件在解压目录下的lib文件夹里面.开发struts2程序最少需要的jar文件为:struts2-core-2.xx.j ...

  2. angular 按需加载

     angular.module('app',[]) .controller('ctrl',function ($http,$scope){ //ctrl控制器,名称作用的范围 html中ng-cont ...

  3. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题

    在VS2008和opendv的环境下: error LNK2019: 无法解析的外部符号_cvDestroyWindow,该符号在函数_wmain 中被引用 error LNK2019: 无法解析的外 ...

  4. [RxJS] Creation operators: interval and timer

    It is quite common to need an Observable that ticks periodically, for instance every second or every ...

  5. Spring AOP 实现原理与 CGLIB 应用--转

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...

  6. CSS3 边框

    说明:CSS3完全向后兼容,因此不必改变现有的设计.浏览器通常支持CSS2 CSS3模块 CSS3被划分为模块: 选择器 框模型 背景和边框 文本效果 2D/3D 转换 动画 多列布局 用户界面 CS ...

  7. DNN - Modules - QR Code Generator

    Dotnetnuke 平台上的二维码模块.支持DNN 7.x平台的安装 QR码(快速响应码)是二维条形码.随着移动设备市场正以快速的步伐,QR码正在成为非常重要的营销工具.与移动电话或平板电脑的扫描, ...

  8. linux下软件安装与卸载

    linux上软件二进制安装主要分为:rpm手动安装和yum在线安装(其所安装的都为rpm二进制包). 关于rpm手动安装,学习后面内容前需分清如下内容: 包全名 : 操作的包是没有安装的软件包时,使用 ...

  9. Arcgis server - ' packaging failed '

    我在使用ARCCatalog发布地图服务时,报这个错:packaging failed 然后我从头试,发现它提示说我的目录'C:\Users\Administrator\AppData\Local\E ...

  10. Dapper事务操作

    1.报错信息: 如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务.命令的 Transaction 属性尚未初始化. 出现这种原因是在执行Execute语句时,没 ...