2

str のこの 2 つの漢字「你好」の Unicode コードポイントがわかっている場合

この char * str コードポイントを漢字に変換して wchar_t * wstr に割り当てるにはどうすればよいですか?

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

このように直接割り当てて問題を解決できることを知っています。

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

しかし、私の問題はそれよりも複雑です。私の状況ではそれができません。

リテラル codepoint から wchar_t * への変換を行うにはどうすればよいですか?

ありがとう。

文字セットを MBCS に設定して MS Visual C を使用しています。UNICODE 文字セットを使用できないと想定しています。

更新: 申し訳ありませんが、wchar_t wstrwchar_t * wstrに修正しました

更新 char * str には、2 つの漢字「你好」の UTF-8 コード単位のシーケンスが含まれています

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次に、();を呼び出すだけです。もちろん、先に進む前に、最初の 2 文字が \x であり、5 番目と 6 番目の文字も \x であることを確認するための検証を追加できます。しかし、これはより堅牢なコードの出発点です。これは堅牢ではなく、テストもされていません。

編集:すべての16進値が大文字であると想定しています。

于 2013-04-12T08:17:21.433 に答える