如何将char *转换为wchar_t *?

我试过这样的function,但不幸的是它不工作:

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应用程序中集成普通string。 任何build议,你们可以提供非常感谢。

使用std::wstring而不是C99可变长度数组。 目前的标准保证std::basic_string的连续缓冲区。 例如,

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

C ++不支持C99变长数组,所以如果你将代码编译为纯C ++,它甚至不会编译。

有了这个改变你的函数返回types也应该是std::wstring

记得在main设置相关的语言环境。

例如, setlocale( LC_ALL, "" )

干杯&hth。,

在你的例子中, wc是一个局部variables,当函数调用结束时将被释放。 这使你进入未定义的行为领域。

简单的解决方法是这样的:

 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; } 

请注意,调用代码将不得不解除分配此内存,否则您将有内存泄漏。

您正在返回堆栈中分配的局部variables的地址。 当你的函数返回时,所有局部variables(比如wc )的存储被解除分配,并且被其他东西立即覆盖。

要解决这个问题,你可以将缓冲区的大小传递给GetWC ,但是你已经有了和GetWC本身相同的接口。 或者,你可以在GetWC分配一个新的缓冲区,并返回一个指向这个缓冲区的指针,留给调用者去释放缓冲区。

 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”

微软build议使用“mbstowcs_s”而不是“mbstowcs”。

链接:

Mbstowcs示例

mbstowcs_s,_mbstowcs_s_l

 wchar_t text_wchar[30]; mbstowcs_s(&length, text_wchar, text_char, length); 

你的问题与编码无关,这是理解基本C ++的一个简单的问题。 你正在返回一个指向你函数中的局部variables的指针,这个variables在任何人都可以使用的时候已经超出了范围,从而产生了未定义的行为 (即编程错误)。

按照这个黄金法则:“如果你使用裸指针,你做错了(除非你不是)。”

我以前发布了一些代码来进行转换,并在C ++ std::stringstd::wstring对象中传递input和输出。

我做了这样的事情 前两个零是因为我不知道这个命令要从我这里得到什么样的asciitypes的东西。 我的一般感觉是创build一个临时字符数组。 传入宽字符数组。 繁荣。 有用。 +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); 

从@Cheers和hth。 – Alf答案,我想出std :: wstring.data()函数返回一个wchar *。 所以代码很简单:

  const wchar_t *GetWC(const char *c){ const size_t cSize = strlen(c) + 1; std::wstring wc( cSize, L'#' ); mbstowcs( &wc[0], c, cSize ); return wc.data(); } 

快乐的编码,