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_smbstowcs_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();