如何使用字符串的值将字符串转换为wstring?

时间:2013-08-14 23:44:35

标签: c++ string wstring

我是C ++的新手,我遇到了这个问题。我有一个名为DATA_DIR的字符串,我需要格式化为wstring。

string str = DATA_DIR;
std::wstring temp(L"%s",str); 

Visual Studio告诉我,没有与参数列表匹配的构造函数实例。显然,我做错了。

我在网上找到了这个例子

std::wstring someText( L"hello world!" );

显然有效(没有编译错误)。我的问题是,如何将存储在DATA_DIR中的字符串值放入wstring构造函数中,而不是像“hello world”这样的任意内容?

5 个答案:

答案 0 :(得分:6)

以下是使用wcstombs(已更新)的实现:

#include <iostream>
#include <cstdlib>
#include <string>

std::string wstring_from_bytes(std::wstring const& wstr)
{
    std::size_t size = sizeof(wstr.c_str());
    char *str = new char[size];
    std::string temp;

    std::wcstombs(str, wstr.c_str(), size);

    temp = str;
    delete[] str;

    return temp;
}

int main()
{
    std::wstring wstr = L"abcd";
    std::string str = wstring_from_bytes(wstr);
}

Here is a demo.

答案 1 :(得分:2)

这是参考最高投票的答案,但我没有足够的声誉和#34;直接评论答案。

解决方案中函数的名称&#34; wstring_from_bytes&#34;意味着它正在做原始海报想要的东西,即获得给定字符串的wstring,但该函数实际上与原始海报要求的相反,并且更准确地命名为&#34; bytes_from_wstring&#34;。

要从字符串转换为wstring,wstring_from_bytes函数应该使用mbstowcs而不是wcstombs

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstdlib>
#include <string>

std::wstring wstring_from_bytes(std::string const& str)
{
    size_t requiredSize = 0;
    std::wstring answer;
    wchar_t *pWTempString = NULL;

    /*
    * Call the conversion function without the output buffer to get the required size
    *  - Add one to leave room for the NULL terminator
    */
    requiredSize = mbstowcs(NULL, str.c_str(), 0) + 1;

    /* Allocate the output string (Add one to leave room for the NULL terminator) */  
    pWTempString = (wchar_t *)malloc( requiredSize * sizeof( wchar_t ));  
    if (pWTempString == NULL)  
    {  
        printf("Memory allocation failure.\n");  
    }
    else
    {
        // Call the conversion function with the output buffer
        size_t size = mbstowcs( pWTempString, str.c_str(), requiredSize);
        if (size == (size_t) (-1))  
        {  
            printf("Couldn't convert string\n");  
        }
        else
        {
            answer = pWTempString;
        }
    }


    if (pWTempString != NULL)
    {
        delete[] pWTempString;
    }

    return answer;
}

int main()
{
   std::string str = "abcd";
   std::wstring wstr = wstring_from_bytes(str);
}

无论如何,在较新版本的标准库(C ++ 11及更新版本)中更容易实现这一点

#include <locale>
#include <codecvt>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;

std::wstring wide = converter.from_bytes(narrow_utf8_source_string);

答案 2 :(得分:1)

printf - 样式格式说明符不是C ++库的一部分,不能用于构造string

如果string可能只包含单字节字符,则范围构造函数就足够了。

std::string narrower( "hello" );
std::wstring wider( narrower.begin(), narrower.end() );

问题是我们通常在宽字符适用时使用wstring(因此w),它们由多字节序列在std::string中表示。这样做会导致多字节序列的每个字节转换为一个不正确的宽字符序列。

此外,要转换多字节序列,需要知道其编码。此信息不会由std::stringstd::wstring封装。 C ++ 11允许您使用std::wstring_convert指定编码和翻译,但我不确定它有多广泛支持。见0x ....的优秀答案。

答案 3 :(得分:0)

我找到了这个功能。找不到任何预定义的方法来执行此操作。

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);

答案 4 :(得分:0)

针对 C++11 及更高版本提到的转换器已弃用 C++17 中的此特定转换,并建议使用 MultiByteToWideChar 函数。

编译器错误 (c4996) 提到定义 _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING。