C字符串到宽C字符串

时间:2012-10-18 19:08:49

标签: c++ unicode wchar-t c-strings

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

基本上,我有一个const char *,它指向一个以null结尾的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;

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

2 个答案:

答案 0 :(得分:2)

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

我唯一要改变的就是使用mbstowcs代替mbstowcs_smbstowcs_s仅适用于Windows,而mbstowcs是可移植的标准C99功能。当然,如果你想在没有完全关闭它的情况下避免使用Microsoft编译器的CRT弃用警告,那么使用#if测试的宏在非Windows系统上使用mbstowcs是完全正常的。和Windows系统上的mbstowcs_s

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

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

答案 1 :(得分:0)

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

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

const wchar_t *wcString= b.c_str();