2

我正在尝试将 char 字符串转换为 wchar 字符串。

更详细地说:我试图先将 char[] 转换为 wchar[],然后将“1”附加到该字符串并打印它。

char src[256] = "c:\\user";

wchar_t temp_src[256];
mbtowc(temp_src, src, 256);

wchar_t path[256];

StringCbPrintf(path, 256, _T("%s 1"), temp_src);
wcout << path;

但它只打印c

这是从char转换为wchar的正确方法吗?从那以后我知道了另一种方式。但我想知道为什么上面的代码会这样工作?

4

3 回答 3

11

mbtowc仅转换单个字符。你的意思是使用mbstowcs

通常你调用这个函数两次;第一个获得所需的缓冲区大小,第二个实际转换它:

#include <cstdlib> // for mbstowcs

const char* mbs = "c:\\user";
size_t requiredSize = ::mbstowcs(NULL, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1))
{
    // Do what's needed with the wcs string
}
delete[] wcs;

如果您更愿意使用mbstowcs_s(由于弃用警告),请执行以下操作:

#include <cstdlib> // also for mbstowcs_s

const char* mbs = "c:\\user";
size_t requiredSize = 0;
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize);
if(requiredSize != 0)
{
    // Do what's needed with the wcs string
}
delete[] wcs;

确保您通过setlocale()或使用带有 locale 参数的mbstowcs()(例如mbstowcs_l()或)版本来处理语言环境问题。mbstowcs_s_l()

于 2010-12-20T18:00:08.360 回答
2

你为什么使用 C 代码,为什么不以更可移植的方式编写它,例如我在这里要做的是使用 STL!

std::string  src = std::string("C:\\user") +
                   std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());

wcout << dne;

这很简单很容易:D

于 2010-12-22T03:40:04.057 回答
0

L“你好世界”

字符串前面的前缀 L 使它成为一个宽字符字符串。

于 2010-12-20T18:00:55.537 回答