ソフトウェア開発 Win32プログラミング

シフトJISをEUCに変換する

戻る


文字コードのシフトJIS(Shift_JIS)をEUC(euc-jp)に変換する方法を以下に示す。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mbstring.h>

#define _IS_SJIS_1(c) ((UINT)((BYTE)(c) ^ 0x20) - 0xa1 < 0x3c)
#define _IS_SJIS_2(c) (0x40 <= (BYTE)(c) && (BYTE)(c) <= 0xfc && (BYTE)(c) != 0x7f)

static WORD _mbcjmstojisex(const BYTE *pszSrc)
{
    WORD w;
    if (_IS_SJIS_1(*pszSrc) && _IS_SJIS_2(pszSrc[1]))
    {
        w = MAKEWORD(pszSrc[1], *pszSrc);
        if (*pszSrc == 0x0fa || *pszSrc == 0x0fb || 
            (*pszSrc == 0x0fc && pszSrc[1] <= 0x04b))
        {
            if      (w <= 0xfa49) w -= 0x0b51;
            else if (w <= 0xfa53) w -= 0x72f6;
            else if (w <= 0xfa57) w -= 0x0b5b;
            else if (w == 0xfa58) w  = 0x878a;
            else if (w == 0xfa59) w  = 0x8782;
            else if (w == 0xfa5a) w  = 0x8784;
            else if (w == 0xfa5b) w  = 0x879a;
            else if (w <= 0xfa7e) w -= 0x0d1c;
            else if (w <= 0xfa9b) w -= 0x0d1d;
            else if (w <= 0xfafc) w -= 0x0d1c;
            else if (w <= 0xfb5b) w -= 0x0d5f;
            else if (w <= 0xfb7e) w -= 0x0d1c;
            else if (w <= 0xfb9b) w -= 0x0d1d;
            else if (w <= 0xfbfc) w -= 0x0d1c;
            else                  w -= 0x0d5f;
        }
        return (WORD)_mbcjmstojis(w);
    }
    return 0;
}


INT SJIS2EUCSize(LPCSTR pszSrc, INT cchSrc)
{
    INT i, cchDest;
    WORD  sCode;

    cchDest = 0;
    for(i = 0; i < cchSrc; i++)
    {
        if (_IS_SJIS_1(pszSrc[i]) && _IS_SJIS_2(pszSrc[i + 1]))
        {
            sCode = (WORD)_mbcjmstojisex(pszSrc + i);
            if (sCode != 0)
            {
                cchDest += 2;
                i++;
            }
            else
            {
                cchDest += 2;
                i++;
            }
        }
        else
        {
            if ((BYTE)pszSrc[i] >= (BYTE)0x80)
                cchDest += 2;
            else
                cchDest++;
        }
    }
    return cchDest + 1;
}

INT SJIS2EUC(LPSTR pszDest, LPCSTR pszSrc, INT cchSrc)
{
    INT i, cchDest;
    WORD  sCode;

    cchDest = 0;
    for(i = 0; i < cchSrc; i++)
    {
        if (_IS_SJIS_1(pszSrc[i]) && _IS_SJIS_2(pszSrc[i + 1]))
        {
            sCode = (WORD)_mbcjmstojisex(pszSrc + i);
            if (sCode != 0)
            {
                pszDest[cchDest]     = (BYTE)0x80 | (BYTE)(sCode >> 8);
                pszDest[cchDest + 1] = (BYTE)0x80 | (BYTE)sCode;
                cchDest += 2;
                i++;
            }
            else
            {
                pszDest[cchDest]     = pszSrc[i];
                pszDest[cchDest + 1] = pszSrc[i + 1];
                cchDest += 2;
                i++;
            }
        }
        else
        {
            if ((BYTE)pszSrc[i] >= (BYTE)0x80)
            {
                pszDest[cchDest]     = (BYTE)0x8e;
                pszDest[cchDest + 1] = pszSrc[i];
                cchDest += 2;
            }
            else
            {
                pszDest[cchDest] = pszSrc[i];
                cchDest++;
            }
        }
    }
    pszDest[cchDest] = '\0';
    return cchDest;
}

#ifdef UNITTEST
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    LPBYTE pszBuf1, pszBuf2, pszBuf3;
    CHAR sz1[] = "Shift_JISをEUCにします。";
    CHAR sz2[] = "Convert to EUC";
    CHAR sz3[] = "半角カナのテスト";
    INT cch1, cch2, cch3;
    
    cch1 = SJIS2EUCSize(sz1, lstrlen(sz1));
    cch2 = SJIS2EUCSize(sz2, lstrlen(sz2));
    cch3 = SJIS2EUCSize(sz3, lstrlen(sz3));
    printf("%d\n", cch1);
    printf("%d\n", cch2);
    printf("%d\n", cch3);
    pszBuf1 = (LPBYTE)malloc(cch1);
    pszBuf2 = (LPBYTE)malloc(cch2);
    pszBuf3 = (LPBYTE)malloc(cch3);
    cch1 = SJIS2EUC(pszBuf1, sz1, lstrlen(sz1));
    cch2 = SJIS2EUC(pszBuf2, sz2, lstrlen(sz2));
    cch3 = SJIS2EUC(pszBuf3, sz3, lstrlen(sz3));
    printf("%d: %s\n", cch1, pszBuf1);
    printf("%d: %s\n", cch2, pszBuf2);
    printf("%d: %s\n", cch3, pszBuf3);
    free(pszBuf1);
    free(pszBuf2);
    free(pszBuf3);
    return 0;
}
#endif

ソース: sjis2euc.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system