通过前一篇文章《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 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html

    Linux 高精確的時序(sleep, usleep,nanosleep) (2010-04-14 17:18:26) 转载▼ 标签: 杂谈 分类: linux 首先, 我会说不保证你在使用者模式 ( ...

  2. 如何获取客户端MAC地址(三个方法)

    方法一: 调用Windows的DOS命令,从输出结果中读取MAC地址: public static String getMACAddress() { String address = "&q ...

  3. 解决pydev报unsolved import的问题

    安装Flask_RESTful-0.2.11包后, 并在pydev 对应的 interpreter 重新刷新了System PYTHONPATH, 看见Lib\site-packages\flask_ ...

  4. 高效的使用 Response.Redirect

    介绍: 我正在评估一个 ASP.NET Web 项目应用.它有一些可扩展性问题.意味着当网站访问量增加的时候.系统将会变得缓慢.当我查看应用日志.我找到了大量的 ThreadAbortExceptio ...

  5. [Kerberos] How to Kerberize an Hadoop Cluster

    Overview Kerberos是一个第三方认证机制,用户和服务(known as principals)通过kerberos server (known as the Key Distributi ...

  6. 【bzoj1596】[Usaco2008 Jan]电话网络

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  7. Pro Mac 如何将英文文件夹汉化为中文

    1.新建一个英文名的文件夹. 2.打开文本编辑,文本编辑 -> 预置 -> 新建文稿 -> 格式,选上纯文本,关闭预置. 3.新建了一个txt文件,在里面输入要汉化的英文名(刚才新建 ...

  8. 百度浏览器+hao123评价

    1.用户界面: 界面比较简洁,没有多余的没用的东西.在界面上部有天气,比较方便用户查看天气,中间有各个实用性网站和大家通常使用较多的网站,可以比较快的查看.侧栏有些比较有针对性的内容.上部还有可以静音 ...

  9. MySQL Python教程(4)

    Class cursor.MySQLCursorBuffered 该类从Class cursor.MySQLCursorBuffered继承,如果需要,可以在执行完SQL语句后自动缓冲结果集合.imp ...

  10. Qt5 程序启动画面动图效果

    2333终于实现动图,先弄了一个窗口去掉标题栏假装就是启动画面了,还是那只萌萌的猫这次会动了! 基类用的是QWidget  类名称MainView #ifndef MAINVIEW_H #define ...