2

如果我知道 str 中这 2 个汉字你好的 unicode 代码点

如何将此 char * str 代码点转换为汉字并将其分配给 wchar_t * wstr ?

char * str = "4F60 597D";
wchar_t * wstr;

我知道我可以像这样直接分配并解决问题。

wchar_t * wstr = L"\u4F60\u597D";

但是我的问题比这更复杂,我的情况不允许这样做。

如何进行从文字代码点到 wchar_t * 的转换?

谢谢。

我正在使用将字符集设置为 MBCS 的 MS Visual C,假设我不能使用 UNICODE 字符集。

更新:抱歉,刚刚将wchar_t wstr更正为wchar_t * wstr

UPDATE char * str 包含 UTF-8 代码单元序列,用于 2 个汉字你好

char * str = "\xE4\xBD\xA0\xE5\xA5\xBD";    
size_t len = strlen(str) + 1;
wchar_t * wstr = new wchar_t[len];
size_t convertedSize  = 0;
_locale_t local = _create_locale( LC_ALL , "Chinese");
_mbstowcs_s_l(&convertedSize, wstr, len, str, _TRUNCATE, local);
MessageBoxW( NULL, wstr , (LPCWSTR)L"Hello", MB_OK);

为什么 MessageBox 打印出日文字符?而不是中文?正确的语言环境名称是什么?

4

1 回答 1

0

我可以考虑这个功能:

#define GetValFromHex(x) (x > '9' ? x-'A'+10 : x - '0')

wchar_t GetChineesChar(const char* strInput)
{
    wchar_t result = 0;
    LPBYTE ptr = (LPBYTE)&result;

    ptr[0] = GetValFromHex(strInput[2]) * 16 + GetValFromHex(strInput[3]);
    ptr[1] = GetValFromHex(strInput[6]) * 16 + GetValFromHex(strInput[7]);

    return result;
}

wchatr_t* GetChineesString(const char* strInput)
{
    size_t  len = strlen(strInput) / 8;
    wchar_t* returnVal = new wchar_t[len];
    for (int i = 0; i < len; i++)
    {
         returnVal[i] = GetChineesChar(&strInput[i*8]);
    }
    return returnVal;
}

那么你应该调用GetChineesString(); 当然,您可以添加更多验证以检查前两个字符是 \x 并且第五个和第六个字符也是 \x 在继续之前。但这是更健壮代码的起点。这不是健壮的,也没有经过测试。

编辑:我假设所有十六进制值都是大写。

于 2013-04-12T08:17:21.433 回答