converting narrow string to wide string

前端 未结 9 1492
难免孤独
难免孤独 2020-12-06 11:57

How can i convert a narrow string to a wide string ?

I have tried this method :

string myName;
getline( cin , myName );
wst         


        
相关标签:
9条回答
  • 2020-12-06 12:36

    You should do this :

    inline std::wstring convert( const std::string& as )
    {
                // deal with trivial case of empty string
        if( as.empty() )    return std::wstring();
    
                // determine required length of new string
        size_t reqLength = ::MultiByteToWideChar( CP_UTF8, 0, as.c_str(), (int)as.length(), 0, 0 );
    
                // construct new string of required length
        std::wstring ret( reqLength, L'\0' );
    
                // convert old string to new string
        ::MultiByteToWideChar( CP_UTF8, 0, as.c_str(), (int)as.length(), &ret[0], (int)ret.length() );
    
                // return new string ( compiler should optimize this away )
        return ret;
    }
    

    This expects the std::string to be UTF-8 (CP_UTF8), when you have another encoding replace the codepage.

    Another way could be :

    inline std::wstring convert( const std::string& as )
    {
        wchar_t* buf = new wchar_t[as.size() * 2 + 2];
        swprintf( buf, L"%S", as.c_str() );
        std::wstring rval = buf;
        delete[] buf;
        return rval;
    }
    
    0 讨论(0)
  • 2020-12-06 12:37

    This article published on the MSDN Magazine 2016 September issue discusses the conversion in details using Win32 APIs.

    Note that using MultiByteToWideChar() is much faster than using the std:: stuff on Windows.

    0 讨论(0)
  • 2020-12-06 12:38

    Here are two functions that can be used: mbstowcs_s and wcstombs_s.

    mbstowcs_s: Converts a sequence of multibyte characters to a corresponding sequence of wide characters. wcstombs_s: Converts a sequence of wide characters to a corresponding sequence of multibyte characters.

    errno_t wcstombs_s(
       size_t *pReturnValue,
       char *mbstr,
       size_t sizeInBytes,
       const wchar_t *wcstr,
       size_t count 
    );
    
    errno_t mbstowcs_s(
       size_t *pReturnValue,
       wchar_t *wcstr,
       size_t sizeInWords,
       const char *mbstr,
       size_t count 
    

    );

    See http://msdn.microsoft.com/en-us/library/eyktyxsx.aspx and http://msdn.microsoft.com/en-us/library/s7wzt4be.aspx.

    0 讨论(0)
  • 2020-12-06 12:40

    Use mbtowc():

    string myName;
    wchar_t wstr[BUFFER_SIZE];
    
    getline( cin , myName );
    mbtowc(wstr, myName, BUFFER_SIZE);
    
    0 讨论(0)
  • 2020-12-06 12:45

    If the source is ASCII encoded, you can just do this:

    wstring printerName;
    printerName.assign( myName.begin(), myName.end() );
    
    0 讨论(0)
  • 2020-12-06 12:46

    I found this while googling the problem. I have pasted the code for reference. Author of this post is Paul McKenzie.

    std::string str = "Hello";
    std::wstring str2(str.length(), L' '); // Make room for characters
    
    // Copy string to wstring.
    std::copy(str.begin(), str.end(), str2.begin());
    
    0 讨论(0)
提交回复
热议问题