C/C++筆記之char *與wchar_t *的相互轉換


char *和wchar_t *的相互轉換,可使用標准庫函數

size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count)和size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count)

注意

微軟文檔對mbstowcs的描述有誤,mbstowcs, _mbstowcs_l | Microsoft Docs

若mbstowcs成功地轉換了源字符串,它返回已轉換的多字節字符的數量。這句話是錯誤的,應參考cppreference的描述std::mbstowcs - cppreference.com

成功,則返回寫入目標數組的寬字符的數量,不包括L'\0'。這句才是正解

另外,根據微軟文檔的描述,若參數wcstr為NULL,函數返回目標字符串的要求大小(以寬字符為單位)

多字節字符串到寬字符串的轉換示例

#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "");
    const char *mbString = "多字節字符串到寬字符串的轉換";
    size_t requiredSize = mbstowcs(nullptr, mbString, 0);
    wchar_t *wcString = new wchar_t[requiredSize + 1];
    if (static_cast<size_t>(-1) == mbstowcs(wcString, mbString, requiredSize + 1))
    {
        cout << "Couldn't convert string: invalid multibyte character." << endl;
    }
    else
    {
        wcout << "wcString: " << wcString << endl;
    }
    delete[] wcString;
    return 0;
}

寬字符串到多字節字符串的轉換示例

#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "");
    const wchar_t *wcString = L"寬字符串到多字節字符串的轉換";
    size_t requiredSize = wcstombs(nullptr, wcString, 0);
    char *mbString = new char[requiredSize + 1];
    if (static_cast<size_t>(-1) == wcstombs(mbString, wcString, requiredSize + 1))
    {
        cout << "Couldn't convert string: invalid wide character" << endl;
    }
    else
    {
        cout << mbString << endl;
    }
    delete[] mbString;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM