我尝试过实现这样的功能,但遗憾的是它不起作用:
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字符串。非常感谢你们提出的任何建议。
答案 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”。
链接:
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::string
和std::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;
}