読者です 読者をやめる 読者になる 読者になる

ShiftJisとUTF8間のコード変換(VC++)

char* szShiftJis = "雨にも負けず、風にも負けず。";
char bufUTF8[MAX_PATH];
char bufShiftJis[MAX_PATH];


void ShiftJisToUTF8()
{
    wchar_t bufUnicode[MAX_PATH];
    
    // まずUniocdeに変換する
    // サイズを計算する
    int iLenUnicode = MultiByteToWideChar(CP_ACP, 0, szShiftJis, strlen(szShiftJis)+1, 
                                                  NULL, 0);
    if (iLenUnicode <= sizeof(bufUnicode)/sizeof(bufUnicode[0]))
    {
        MultiByteToWideChar(CP_ACP, 0, szShiftJis, strlen(szShiftJis)+1, bufUnicode, MAX_PATH);
        // 次に、UniocdeからUTF8に変換する
        // サイズを計算する
        int iLenUtf8 = WideCharToMultiByte(CP_UTF8, 0, bufUnicode, iLenUnicode, NULL, 0, 
                                                 NULL, NULL);
        if (iLenUtf8 <= sizeof(bufUTF8))
        {
            WideCharToMultiByte(CP_UTF8, 0, bufUnicode, iLenUnicode, bufUTF8, sizeof(bufUTF8), 
                                     NULL, NULL);
        }
    }
}

void UTF8ToShiftJis()
{
    wchar_t bufUnicode[MAX_PATH];
    
    // まずUniocdeに変換する
    // サイズを計算する
    int iLenUnicode = MultiByteToWideChar(CP_UTF8, 0, bufUTF8, strlen(bufUTF8)+1, NULL, 0);
    if (iLenUnicode <= sizeof(bufUnicode)/sizeof(bufUnicode[0]))
    {
        MultiByteToWideChar(CP_UTF8, 0, bufUTF8, strlen(bufUTF8)+1, bufUnicode, MAX_PATH);
        // 次に、UniocdeからShiftJisに変換する
        // サイズを計算する
        int iLenUtf8 = WideCharToMultiByte(CP_ACP, 0, bufUnicode, iLenUnicode, NULL, 0, 
                                                  NULL, NULL);
        if (iLenUtf8 <= sizeof(bufUTF8))
        {
            WideCharToMultiByte(CP_ACP, 0, 
                                     bufUnicode, iLenUnicode, 
                                     bufShiftJis, sizeof(bufShiftJis), 
                                     NULL, NULL);
        }
    }
}

ネタ元