プログラミングメモ →目次

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

WindowsAPIのMultiByteToWideChar()関数を利用して、ShiftJisコードをUnicodeへ、WideCharToMultiByte()を関数を利用してUnicodeをShiftJisコードに変換することができます。ShiftJisコードとUTF8コードは、両方ともMultiByteコードですので、ShiftJisコードからUTF8に変換するには、Unicode経由しなければなりません。
 

例:ShiftJisコードをUTF8コードに変換した後に、また、UTF8コードをShiftJisコードに変換し戻します。

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);
        }
    }
}

void CXxxxxDlg::OnButton1() 
{
    ShiftJisToUTF8();
    UTF8ToShiftJis();
}