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

EUCをシフトJISに変換する

戻る


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

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

#define ISEUC1(b) (0xA1 <= (BYTE)(b) && (BYTE)(b) <= 0xFE)
#define ISEUC2(b) (0xA1 <= (BYTE)(b) && (BYTE)(b) <= 0xFE)

INT EUC2SJIS(LPSTR pszDest, LPCSTR pszSrc, INT cchSrc)
{
    WORD sCode;
    INT iSrc, cchDest;
    CHAR sz[2];

    iSrc = cchDest = 0;
    while(iSrc < cchSrc)
    {
        if ((BYTE)pszSrc[iSrc] == (BYTE)0x8E && iSrc < cchSrc - 1)
        {
            pszDest[cchDest++] = pszSrc[++iSrc];
            iSrc++;
        }
        else if (iSrc < cchSrc - 1 && ISEUC1(pszSrc[iSrc]) && 
                 ISEUC2(pszSrc[iSrc + 1]))
        {
            sz[0] = pszSrc[iSrc] & 0x7f;
            sz[1] = pszSrc[iSrc + 1] & 0x7f;
            sCode = (WORD)_mbcjistojms(
                (UINT)(((WORD)sz[0] << 8) | ((WORD)sz[1])));
            if(sCode != 0)
            {
                pszDest[cchDest] = (BYTE)(sCode >> 8);
                pszDest[cchDest + 1] = (BYTE)(sCode);
                cchDest += 2;;
                iSrc += 2;
            }
            else
                pszDest[cchDest++] = pszSrc[iSrc++];
        }
        else
            pszDest[cchDest++] = pszSrc[iSrc++];
    }
    pszDest[cchDest] = 0;
    return cchDest;
}

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

int main(void)
{
    CHAR sz1[] = "EUCをSJISにします。";
    CHAR sz2[] = "半角カナのテスト";
    LPSTR psz1, psz2;
    psz1 = (LPSTR)malloc(sizeof(sz1));
    psz2 = (LPSTR)malloc(sizeof(sz2));
    EUC2SJIS(psz1, sz1, lstrlen(sz1));
    EUC2SJIS(psz2, sz2, lstrlen(sz2));
    puts(psz1);
    puts(psz2);
    free(psz1);
    free(psz2);
    return 0;
}
#endif  /* def UNITTEST */

ソース: euc2sjis.zip


戻る

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

inserted by FC2 system