zoukankan      html  css  js  c++  java
  • C++中Cstring、wstring 和string互相转换总结

    通过前一篇文章《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的长度]='';
    
    //但是要注意最后赋值''!!!
    
    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]='';
    
    }
    
     
    
    //---------------------------------------------------------------------------
    
    //  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);

  • 相关阅读:
    [Linux] crontab和shell每天定时备份数据库
    [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市
    [javascript] elementui和vue下复制粘贴上传图片
    [Go] GO-FLY客服项目被公众号 "转角遇到GitHub " 推荐
    [javascript] cdn模式下vue和vue-router实现路由
    [Go] Golang发送http GET请求
    [MySQL] 利用explain查看sql语句中使用的哪个索引
    [Go]GO语言实战-小程序或公众号接口gin框架验证微信服务器消息签名-开源WEB客服
    [Go]GO语言实战-开源WEB客服GO-FLY-gorm下分页的实现
    [前端] 设定为disabled的表单域值不能被提交
  • 原文地址:https://www.cnblogs.com/guolixiucai/p/4787507.html
Copyright © 2011-2022 走看看