c++ 如何将LPCWSTR转换为wchar_t*?

egdjgwm8  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(252)

我需要将一个LPCWSTR数据转换为wchar_t*。我尝试了一堆方法,有些工作,但当我试图获得他们的代码页时,他们显示不同的值。
代码概述:

std::string ChineseCharacter(LPCWSTR Data) //Data value: "丂\n"
{
    CString sHexValue = "";
    std::wstring sData(Data);

    wchar_t* str1 = (wchar_t*)Data;
    //wchar_t* str2 = (wchar_t*)_wcsdup(sData.c_str());

    wchar_t* str3 = (wchar_t*)(L"丂\n"); //u4E02 -- CP 8140 ** CP is needed

    for (int i = 0; i < 4; i++)
    {
        sHexValue2.Format("%02x", str1[i]);//-- 4E02 -- FAIL
        //sHexValue2.Format("%02x", str2[i]);//-- 4E02 -- FAIL
        sHexValue2.Format("%02x", str3[i]);//-- First loop: 81, second one: 40 -- OK
    }
}

据观察者称,这些值为:

str1= L"丂\n"
str3= L"@\n"

我的疑问是,如何将Data的值传递给wchar_t*,使其与硬编码时的值相等?
参考:
https://uic.io/en/charset/show/gb18030/

z2acfund

z2acfund1#

LPCWSTR只是const wchar_t*的别名。要将其转换为wchar_t*,可以使用const_cast,例如:

wchar_t* str = const_cast<wchar_t*>(Data);

(just确保不向所指向的存储器写入任何内容)。
但是,您所展示的代码中没有任何内容需要使用非常数wchar_t*(或std::wstring),因此您可以直接循环Data,根本不需要将LPCWSTR转换为wchar_t*,例如:

std::string ChineseCharacter(LPCWSTR Data)
{
    CString sHexValue;

    for (int i = 0; (i < 4) && (Data[i] != L'\0'); ++i)
    {
        sHexValue.Format("%02hx", static_cast<unsigned short>(Data[i]));
    }

    return static_cast<char*>(sHexValue);
}

或者,仅使用标准C++:

std::string ChineseCharacter(const wchar_t *Data)
{
    std::ostringstream sHexValue;

    for (int i = 0; (i < 4) && (Data[i] != L'\0'); ++i)
    {
        sHexValue << std::setw(2) << std::setfill('0') << std::hex << static_cast<unsigned short>(Data[i]);
    }

    return sHexValue.str();
}

相关问题