C字符串到宽C字符串
C string to wide C string
本文关键字:字符串 更新时间:2023-10-16
我敢肯定,这个问题会经常问,但我只想确保没有更好的方法来做到这一点。
基本上,我有一个const char*,它指向零端的c字符串。我有另一个函数,可以期望指向具有相同字符的字符串。
目前,我一直在尝试这样做:
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;
我需要在很多地方进行这些转换,因为我要与一个期望一个或另一个的第三方库打交道。这是推荐的方法吗?
您正在做的几乎是推荐的方法,假设您的数据都是ASCII。如果其中有非ASCII数据,则需要知道其编码是什么:UTF-8,Windows-1252,任何ISO 8859变体,Shift-jis等。每个人都需要以不同的方式转换。。
我唯一更改的是使用mbstowcs
而不是mbstowcs_s
。mbstowcs_s
仅在Windows上可用,而mbstowcs
是可移植的标准C99功能。当然,如果您想避免使用Microsoft编译器的CRT弃用警告而不完全关闭它们,那么使用#if
测试的宏在Windows Systems上使用mbstowcs
在Windows Systems上使用CC_6,这是完全可以的。p>您也可以使用mbstowcs
来获得转换的字符串的长度,首先在NULL
中传递目标。这样,无论输入字符串多长时间,您都可以避免截断;但是,它确实涉及两次转换字符串。
对于非ASCII转换,我建议使用libiconv。
您没有说涉及哪些编码。如果您有非数字字符串,则可以使用以下方式:
std::string a("hello");
std::wstring b(s.begin(), s.end());
const wchar_t *wcString= b.c_str();