我确信这个问题会被问到很多,但我只是想确保没有更好的方法来做到这一点。
基本上,我有一个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;
我需要在很多地方进行这些转换,因为我正在处理期望其中一个的第三方库。这是推荐的解决方法吗?
答案 0 :(得分:2)
假设您的数据全部是ASCII,那么您所做的几乎就是推荐的做法。如果你有非ASCII数据,你需要知道它的编码是什么:UTF-8,Windows-1252,任何ISO 8859变体,SHIFT-JIS等。每个都需要以不同的方式转换
我唯一要改变的就是使用mbstowcs
代替mbstowcs_s
。 mbstowcs_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();