如何将char *转换为wchar_t *?

时间:2011-11-07 02:11:01

标签: c++ winapi unicode mingw type-conversion

我尝试过实现这样的功能,但遗憾的是它不起作用:

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t wc[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

我的主要目标是能够在Unicode应用程序中集成普通的char字符串。非常感谢你们提出的任何建议。

7 个答案:

答案 0 :(得分:35)

在您的示例中,wc是一个局部变量,在函数调用结束时将被释放。这会使您进入未定义的行为领域。

简单的解决方法是:

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

请注意,调用代码必须释放此内存,否则会出现内存泄漏。

答案 1 :(得分:31)

使用std::wstring代替C99可变长度数组。当前标准保证std::basic_string的连续缓冲区。如,

std::wstring wc( cSize, L'#' );
mbstowcs( &wc[0], c, cSize );

C ++不支持C99可变长度数组,因此如果您将代码编译为纯C ++,它甚至都不会编译。

通过该更改,您的函数返回类型也应为std::wstring

请务必在main中设置相关区域设置。

,例如setlocale( LC_ALL, "" )

干杯&第h。,

答案 2 :(得分:4)

const char* text_char = "example of mbstowcs";
size_t length = strlen(text_char );

使用示例“mbstowcs”

std::wstring text_wchar(length, L'#');

//#pragma warning (disable : 4996)
// Or add to the preprocessor: _CRT_SECURE_NO_WARNINGS
mbstowcs(&text_wchar[0], text_char , length);

使用示例“mbstowcs_s”

Microsoft建议使用“mbstowcs_s”而不是“mbstowcs”。

链接:

Mbstowcs example

mbstowcs_s, _mbstowcs_s_l

wchar_t text_wchar[30];

mbstowcs_s(&length, text_wchar, text_char, length);

答案 3 :(得分:2)

您将返回堆栈上分配的本地变量的地址。当您的函数返回时,所有局部变量(例如wc)的存储都将被释放,并且会被其他东西立即覆盖。

要解决此问题,您可以将缓冲区的大小传递给GetWC,但是您可以使用与mbstowcs本身相同的接口。或者,您可以在GetWC内分配一个新缓冲区并返回指向该缓冲区的指针,将其留给调用者以释放缓冲区。

答案 4 :(得分:1)

您的问题与编码无关,这是理解基本C ++的简单问题。您正在从函数返回指向局部变量的指针,当任何人都可以使用它时,它将超出范围,从而创建未定义的行为(即编程误差)。

遵循这条黄金法则:“如果你正在使用赤裸的指针,你就是在做错了。(除非你没有。)”

previously posted使用了一些代码来进行转换,并在C ++ std::stringstd::wstring对象中传递输入和输出。

答案 5 :(得分:1)

我做了这样的事。前2个零是因为我不知道这个命令想要什么样的ascii类型的东西。我的一般感觉是创建一个临时字符数组。传入宽字符数组。繁荣。有用。 +1确保空终止字符位于正确的位置。

char tempFilePath[MAX_PATH] = "I want to convert this to wide chars";

int len = strlen(tempFilePath);

// Converts the path to wide characters
    int needed = MultiByteToWideChar(0, 0, tempFilePath, len + 1, strDestPath, len + 1);

答案 6 :(得分:0)

<块引用>

安德鲁·谢泼德的回答。

Andrew Shepherd 的回答对我有好处,我总结了一些修复: 1、去掉结尾的字符L'\0',因为有时候会出问题。 2、使用mbstowcs_s

std::wstring wtos(std::string& value){
    const size_t cSize = value.size() + 1;

    std::wstring wc;
    wc.resize(cSize);

    size_t cSize1;
    mbstowcs_s(&cSize1, (wchar_t*)&wc[0], cSize, value.c_str(), cSize);

    wc.pop_back();

    return wc;
}