通过前一篇文章《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. linux下svn的命令

    原文地址:http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076783.html

  2. Orchard源码分析(7):ASP.NET MVC相关

    概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展.主 ...

  3. XStream使用总结

    最近做webService报文转换的公共接口使用到了XSream工具库,写个小总结备忘... XStream是一个可以将javaBean与XML双向转换的java类库,本文内容基于xstream-1. ...

  4. struts2上传文件添加进度条

    给文件上传添加进度条,整了两天终于成功了. 想要添加一个上传的进度条,通过分析,应该是需要不断的去访问服务器,询问上传文件的大小.通过已上传文件的大小, 和上传文件的总长度来评估上传的进度. 实现监听 ...

  5. 快速理解C#高级概念(一) Delegate委托

    做.NET开发很久,最近重新温习<C#高级编程>一书.发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的. 所以,打算开写<C#高级编程系列>博文.其中会借鉴<C ...

  6. 同步和异步UDP使用方法

    同步和异步Socket的区别是,同步Socket会阻塞当前进程,而异步Socket则不会. 首先,一个最简单的同步UDP收发程序实例.可以看到,发送调用Send()函数之后,开始调用Receive接收 ...

  7. 安装好Android Studio(如果内存足够可以改下as的内存)

    找到studio的bin目录,找到如下文件

  8. 理解CSS3中的background-size(对响应性图片等比例缩放)

    理解CSS3中的background-size(对响应性图片等比例缩放) 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用ba ...

  9. 常见的几个angular.js的问题

    来源于网络收集 一.ng-show/ng-hide 与 ng-if的区别? 我们都知道ng-show/ng-hide实际上是通过display来进行隐藏和显示的.而ng-if实际上控制dom节点的增删 ...

  10. 5、数组和集合--Collection、Map

    一.数组:同一个类型数据的集合,其实他也是一个容器 1.数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些数据 2.数组的定义: 在Java中常见: 格式1:  类型 [] 数组名 = ne ...