通过前一篇文章《C++中string,wstring,CString的基本概念和用法》,对Cstring、wstring 和string有了一个了解。string是C++提供的标准字符串操作类.wstring是操作宽字符串的类.。CString是对string(字符串)和wstring(宽字符串)的一个封装,常用在mfc中,用来解决编码问题的。在编程过程中,经常会遇到Cstring、wstring 和string之间的相互转换,在这里做了个简单地总结,另外也会附上其他类型的转换。常见的转换方式无非是三种:赋值转换、使用API函数转换、使用第三方库。

赋值方式:

//---------------------------------------------------------------------------

// wstring转化为string

//---------------------------------------------------------------------------

string ws2s(wstring& ws)

{

string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";

setlocale(LC_ALL, "chs");

const wchar_t* _Source = ws.c_str();

size_t _Dsize = 2 * ws.size() + 1;

char *_Dest = new char[_Dsize];

memset(_Dest,0,_Dsize);

wcstombs(_Dest,_Source,_Dsize);

string result = _Dest;

delete []_Dest;

setlocale(LC_ALL, curLocale.c_str());

return result;

}

//---------------------------------------------------------------------------

//将string 转换为wstring

//---------------------------------------------------------------------------

wstring s2ws( const std::string& s )

 {

  setlocale(LC_ALL, "chs");

  const char* _Source = s.c_str();

  size_t _Dsize = s.size() + 1;

  wchar_t *_Dest = new wchar_t[_Dsize];

  wmemset(_Dest, 0, _Dsize);

  mbstowcs(_Dest,_Source,_Dsize);

  std::wstring result = _Dest;

  delete []_Dest;

  setlocale(LC_ALL, "C");

  return result;

 }

//----------------------------------------------------

// char *到string

//-----------------------------------------------------

string CharToString(char*arr,int count)

{

string result(arr,4);

return result;

}

//-------------------------------------------------------------

//string到char *

//-----------------------------------------------------------

//一个一个字符的赋值

char *p = new char[sring的长度+1];

p[string的长度]='\0';

//但是要注意最后赋值'\0'!!!

char * StringToChar(string &str)

{

int len=str.length();

char * p= new char[len+1];

for (int i=0;i<len;i++)

{

p[i]=str[i];

}

p[len]='\0';

}

//---------------------------------------------------------------------------

//  CString到string

//---------------------------------------------------------------------------

//只需一个一个赋值即可!!

string CStringToString(CString cstr)

{

string result(cstr.GetLength(),'e');

for (int i=0;i<cstr.GetLength();i++)

{

   result[i]=(char)cstr[i];

}

return result;

}

//---------------------------------------------------------------------------

// string到CString

//---------------------------------------------------------------------------

CString StringToCString(string str)

{

CString result;

for (int i=0;i<(int)str.length();i++)

{

   result+=str[i];

}

return result;

}

//----------------------------------------------------------------------

// 将CString 转换为 TCHAR*

//----------------------------------------------------------------------

TCHAR* CString2TCHAR(CString &str)

{

int iLen = str.GetLength();

TCHAR* szRs = new TCHAR[iLen];

lstrcpy(szRs, str.GetBuffer(iLen));

str.ReleaseBuffer();

return szRs;

}

//----------------------------------------------------------------------

// 将TCHAR* 转换为 char*

//----------------------------------------------------------------------

char* THCAR2char(TCHAR* tchStr)

{

int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度

char* chRtn = new char[iLen+1]

wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值

return chRtn;

}

//-----------------------------------------------------------------

// 将CString转换为 char*

//-----------------------------------------------------------------

char* CString2char(CString &str)

{

int len = str.GetLength();

char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度

memset(chRtn, 0, 2*len+1);

USES_CONVERSION;

strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));

return chRtn;

}

//----------------------------------------------------------------------

// 将CString(unicode)转换为char*(ANSI)

//----------------------------------------------------------------------

char* UCString2Nchar(const CString &s)

{

int nSize = 2*s.GetLength();

char *pAnsiString = new char[nSize+1];

wcstombs(pAnsiString, s, nSize+1);

return pAnsiString;

}

WideCharToMultiByte和MultiByteToWideChar

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。WideCharToMultiByte和MultiByteToWideChar函数就是提供这种功能

#include <string>

//--------------------------------------------------------------------------------

//将 单字节char* 转换为 宽字节 wchar*

//-------------------------------------------------------------------------------

wchar_t* AnsiToUnicode( const char* szStr )

{

int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );

if (nLen == 0)

{

   return NULL;

}

wchar_t* pResult = new wchar_t[nLen];

MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );

return pResult;

}

//-----------------------------------------------------------------------------

//将 宽字节 wchar* 转换为 单字节char*

//-----------------------------------------------------------------------------

void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )

{

int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );

wszStr.resize(nLength);

LPWSTR lpwszStr = new wchar_t[nLength];

MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );

wszStr = lpwszStr;

delete [] lpwszStr;

}

使用第三方库

微软提供了一个工具,用于string和wstring之间的转换.

utf8conv.h

这个头文件中提供了一个utf8util 的命名空间,里面包含了如下的字符转换函数:

std::wstring UTF16FromUTF8(const std::string & utf8);

std::wstring UTF16FromUTF8(const char * utf8);

std::string UTF8FromUTF16(const std::wstring & utf16);

std::string UTF8FromUTF16(const wchar_t * utf16);

这个工具足够string与wstring之间的转换了.

其他:

string或者wstring转换到CString:

要把std::string或者std::wstring类型的数据存放到CString中,直接调用string::c_str()或者wstring::c_str()就行了.

CString转换到string或者wstring

CString::GetBuffer(0)就能转换到string或者wstring.如果编译时候定义了UNICODE,则转换到wstring;如果未定义,则转换到string.

string与wstring之间的转换

string,wstring转数字

需要使用stringstream,wstringstream(都在sstream头文件中包含)

   int val;

   string str;

   stringstream ss (stringstream::in | stringstream::out);

   ss << str;

   ss >> val;

CString 转数字

_ttoi()这是个宏,如果定义了UNICODE,则等价于_wtoi(),否则对应atoi(),要使用,需要引入<stdlib.h>

数字转CString

int iValue = 0;

CString::Format(_T("%d") , iValue);

C++中Cstring、wstring 和string互相转换总结的更多相关文章

  1. C++中cstring.h和string.h的区别

    转载:https://blog.csdn.net/qian_chun_qiang/article/details/80648691 1.string与cstring有什么区别 <string&g ...

  2. mfc中CString转化为string的方法

    LL(1)分析法实验的mfc做到最后因为CString转化为string的问题卡了一个多小时,也是惨,网上各种方法找过都不行.幸亏最后还是找到几行代码搞定了.特此mark一下. USES_CONVER ...

  3. Android中 int,float,Double,String 互相转换

    1 如何将字串 String 转换成整数 int?  A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...

  4. C++ WString与String互相转换

    std::wstring StringToWString(const std::string& str) { , str.c_str(), -, NULL, ); wchar_t *wide ...

  5. java和js中JSONObject,JSONArray,Map,String之间转换

    --------------------------------------------------Java中--------------------------------------------- ...

  6. mybatis与mysql中的Date和String之间转换

    在javaweb开发过程中,难免会使用日期类型,在持久化时java的日期格式可以是String,Date.mysql格式可以是varchar,datetime.他们之间如何进行相互转化? 1 java ...

  7. CString 与 std::string 相互转化

    MFC中CString 与 std::string 相互转化 CString实际是CStringT, 也就是模板类, 在UNICODE环境下,实际是CStringW, 在多字符集环境下,实际是CStr ...

  8. wchar_t与char、wstring与string的相互转换

    个人倾向于使用优秀的开源库做这个. 最近使用boost进行转换,代码极其简单: boost::filesystem::path src(wchar_t); char = src.string().c_ ...

  9. VC++中 wstring和string的互相转换实现

    在VC++开发中,经常会用到string和wstring,这就需要二者之间的转换,项目中封装了wstring和string相互转换的2个函数,实现如下: //将wstring转换成string std ...

随机推荐

  1. Apache CXF实现WebService入门教程(附完整源码)

    Apache CXF实现WebService非常简单实用,只需要几步就可以实现一个简单的web service. 首先我们需要新建一个maven项目,在pom中添加依赖和jetty作为测试的web s ...

  2. R--基本统计分析方法(包及函数)

    摘要:目前经典的统计学分析方法主要有回归分析,Logistic回归,决策树,支持向量机,聚类分析,关联分析,主成分分析,对应分析,因子分析等,那么对于这些经典的分析方法在R中的使用主要有那些程序包及函 ...

  3. Unity3D

    一.安装配置 1.下载页面:http://unity3d.com/get-unity 分个人版本和专业版,个人版免费,但少了很多功能(主要是渲染相关,具体请看官方说明), 专业版是每月 75$ 或一次 ...

  4. Tomcat 6 —— Realm域管理

    本篇来源于官方文档,但不仅仅是翻译,其中不乏网上搜索的资料与自己的理解. 如有错误,请予指正. 什么是Realm 首先说一下什么是Realm,可以把它理解成“域”,也可以理解成“组”,因为它类似 类U ...

  5. Ansible简明使用手册

            Ansible使用简明手册 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric ...

  6. hadoop安装实战(mac实操)

    集群环境配置参考(http://blog.csdn.net/zcf1002797280/article/details/49500027) 参考:http://www.cnblogs.com/liul ...

  7. 一张图告诉你,只会jQuery还不够!

    会了jquery语法,会了jquery函数,你就真的会了jquery吗,来看这张图!是超实用的jquery代码段一书的导览!熊孩子们,赶紧学习去吧! 对于码农来说,代码就是生产力,你每天能码多少行并不 ...

  8. Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载

    [Postman for Chrome 离线下载] Postman-REST-Client离线安装包,可直接在Chrome浏览器本地安装使用,可模拟各种http请求,Restful Api测试, CS ...

  9. SQL2008"阻止保存要求重新创建表的更改"问题的解决

    在sql server2008中修改数据库中某个字段的时候,会弹出以下提示: 导致数据库表在表设计界面无法修改,好像只能通过sql语句修改,其实只要改一下sql server的一个配置项就可以了,具体 ...

  10. 全文检索引擎Solr系列——整合MySQL、MongoDB

    MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...