使用mbstowcs
的正确方式是调用两次以查找结果的长度:
const char * cs = <your input char*>
size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);
wchar_t * buf = new wchar_t[wn + 1]();
wn = mbsrtowcs(buf, &cs, wn + 1, NULL);
assert(cs == NULL);
delete[] buf;
别忘了在程序开头调用 setlocale(LC_CTYPE, "");
!
与 Windows 的 MultiByteToWideChar
相比,这个方法完全符合标准 C,但在 Windows 上你可能仍然更喜欢使用 Windows API 函数。
通常我会将这个方法和相反的方法一起封装在两个转换函数中,分别是 string
->wstring
和 wstring
->string
。如果你还添加了一些微不足道的重载,例如 string
->string
和 wstring
->wstring
,你就可以轻松编写支持 Winapi TCHAR
typedef 的代码了。
[编辑:] 我将零初始化添加到了 buf
中,以防您计划直接使用 C 数组。不过,我通常会将结果作为 std::wstring(buf, wn)
返回,但如果您计划使用 C 风格的空结尾数组,请注意。
在多线程环境下,应该将一个线程本地的转换状态作为最终参数传递给该函数(目前该参数不可见)。
这里有一篇我关于这个主题的小发牢骚。