2

我确信这个问题被问了很多,但我只是想确保没有更好的方法来做到这一点。

基本上,我有一个 const char* 指向一个以空字符结尾的 C 字符串。我有另一个函数,它期望 const wchar_t* 指向具有相同字符的字符串。

暂时,我一直在尝试这样做:

    size_t newsize = strlen(myCString) + 1;
    wchar_t * wcstring = new wchar_t[newsize];
    size_t convertedChars = 0;

    mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE);

    delete[] wcstring;

我需要在很多地方进行这些转换,因为我正在处理期望一个或另一个的第三方库。这是推荐的方法吗?

4

2 回答 2

2

假设您的数据都是 ASCII,那么您所做的几乎就是推荐的方法。如果那里有非 ASCII 数据,则需要知道它的编码是什么:UTF-8、Windows-1252、任何 ISO 8859 变体、SHIFT-JIS 等。每个都需要以不同的方式进行转换.

我唯一会改变的是使用mbstowcs而不是mbstowcs_s. mbstowcs_s仅在 Windows 上可用,mbstowcs而是可移植的标准 C99 函数。当然,如果您想避免使用 Microsoft 编译器的 CRT 弃用警告而不完全关闭它们,那么在非 Windows 系统和Windows 系统上#if使用测试宏是完全可以的。mbstowcsmbstowcs_s

您还可以mbstowcs通过首先传入目标来获取转换后的字符串的长度NULL。这样,无论输入字符串有多长,您都可以避免截断;但是,它确实涉及将字符串转换两次。

对于非 ASCII 转换,我建议使用libiconv

于 2012-10-18T19:18:07.043 回答
0

您还没有说涉及到哪些编码。如果你有非多字节字符串,你可以使用这个:

std::string a("hello");
std::wstring b(s.begin(), s.end());

const wchar_t *wcString= b.c_str();
于 2012-10-18T19:57:24.247 回答