C3Lab研究室

Back to Title Page(OpenLab)タイトルページへ戻る

最終更新日: 1998年 11月 05日 木曜日

*文字列を扱うクラスを作成する

CStrObj クラスにより文字列(全角・半角)を容易に利用する

 CStrObjクラスは以前から他のサンプルに含まれていましたが今回から分離しました。 分離した理由は他のプロジェクト作成の折により広範囲な文字列操作クラスとして簡単に アプリケーションを作成できるようにするためです。
 今回分離する際に、電子メールで良く使われるBase64・QuotedーPrintable コードの変換関数や、電子メールRFC1522拡張ヘッダーへの対応・RFC1468 コードでの電子メール本文の漢字コードの埋め込みに対応するようにしました。
 現在Base64へのSJISからの変換はデバッグ&作成中ですが、Base64で埋め込まれた RFC1522拡張ヘッダーの日本語解析はデバッグ済みです。こうしたアルゴリズムの多くは JAVAへ移植可能なコードで記載しています。ポインターを使用している部分については 配列を使用するように変更するなどすれば比較的容易にJAVAへは移植できるでしょう。

主な拡張機能

全角->半角への変換を行う
ワイルドカードが利用可能な文字列比較関数を追加する
Base64・Quoted-Printable・JIS->SJIS・等のデータを読めるように変更する

今後の予定。

Base64へのSJISコードの変換(現在デバッグ中)
UUENCODE などのバイナリファイルをテキストファイルへの変換など
半角コードを全角へ変換

ヘッダーファイル(CStrObj.h)

/*   
* CStrObj class Copyright (c) Kitaro 1998
* Rev 1.30.00 1998/11/05
*
*/

#ifndef __CLASS_CSTROBJ__
#define __CLASS_CSTROBJ__



#include <afxwin.h>

class CStrObj : public CObject{
    public :
        CStrObj();
        virtual ~CStrObj();
    public : // CFile
        LPSTR ReadLine(CFile *cf); // CFileから一行読み込み

    public : // 全角半角文字列操作関数
        void ZipSJis2Asc    (LPSTR srcdest); // 全角郵便番号を半角へ、半角入力OK、7桁の場合ハイフン挿入
        void SujiSJis2Asc    (LPSTR srcdest); // 全角数字(ハイフン)を半角へ、半角入力OK
        void ZipSJis2Asc    (LPSTR src,LPSTR dest); // 全角郵便番号を半角へ、半角入力OK、7桁の場合ハイフン挿入
        void SujiSJis2Asc    (LPSTR src,LPSTR dest); // 全角数字(ハイフン)を半角へ、半角入力OK

        // 平仮名全角−>片仮名半角
        void Hirakana2Hankaku(LPSTR srcdest);
        void Hirakana2Hankaku(LPSTR src,LPSTR dest);

        // ALL Hankaku
        void AllHankaku(LPSTR srcdest);
        void AllHankaku(LPSTR src,LPSTR dest);
    public : // JIS <= => SJIS 変換
        int Jis2SJis(int *ph,int *pl); // HiByte , LowByte
        int SJis2Jis(int *ph,int *pl); // HiByte , LowByte
        CString Jis2SJis(CString s);
        CString Jis2SJis(LPSTR s);
    public: // RFC1522
        CString DecodeRFC1522(CString s);
        CString DecodeRFC1522(LPSTR s);
    public :// string decode
        CString DecodeQuotedPrintable(CString s);
        CString DecodeQuotedPrintable(LPSTR s);
        CString DecodeBase64(CString s);
        CString DecodeBase64(LPSTR s);
        private: // private menber for local use
            char DecodeBase64(char c); // decode charcode to 6bit data
    public: // 文字列変換
        CString EncodeQuoted(CString szMessage); // quoted-printable文字列に変換
        CString EncodeQuoted(LPCTSTR szMessage); // quoted-printable文字列に変換
        CString EncodeBASE64(CString szMessage); // BASE64 文字列変換
        CString EncodeBASE64(LPCTSTR szMessage);

    public : // 文字列比較関数
        int         StrCmpLen    (LPSTR src1,LPSTR src2);    //    先頭から一致する長さを返す
        int         StrCmpLenEx    (LPSTR src1,LPSTR src2);    //     途中も含めて一致する最大文字数を返す
        int         StrCmpStartEx(LPSTR src1,LPSTR src2);     //     途中も含めて一致する最大文字数の位置を返す
       
        int StrCmpWild(LPSTR src1,LPSTR src2,int length = -1);    // Wild文字対応、全角半角対応比較、文字数指定可能
    public : // 文字数調査関数
        int    StrLen(LPSTR src); // 全角・半角文字数を調べる
        int Count(LPSTR src,WORD n); // 全角半角を区別し含まれる文字コードの数を返す

};


#endif // __CLASS_CSTROBJ__


本体ファイル(CStrObj.CPP)


#include "CStrObj.h"

CStrObj::CStrObj(){};
CStrObj::~CStrObj(){};


//---------------------------------------------------------------

CString CStrObj::EncodeBASE64(CString szMessage){ // BASE64 文字列変換
    return( EncodeBASE64( LPCTSTR(szMessage) ) );
}
CString CStrObj::EncodeBASE64(LPCTSTR szMessage){
    char bIndex[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    CString s,s2;
    int k,i,n;
    char *buf;
    s2 = szMessage;
    while( ( s2.GetLength() %3)!=0 ) s2+="=";
    n = s2.GetLength();
    buf = (char*)malloc( n + 4 );
    ZeroMemory(buf,n+4);
    memcpy(buf,LPCTSTR(s2),n);
    s="";
    for(k=n,i=0;i<n;i+=3){
        __int32 d;
        char b[2];
        b[1]=0;
        memcpy(&d,buf+i,3);
        { b[0] = bIndex[(d&0x3f)]; d>>=6; s+=b; k--; }
        { b[0] = bIndex[(d&0x3f)]; d>>=6; s+=b; k--; }
        { b[0] = bIndex[(d&0x3f)]; d>>=6; s+=b; k--; }
        { b[0] = bIndex[(d&0x3f)]; d>>=6; s+=b; k--; }
    }
    free(buf);
    return s;
}

//---------------------------------------------------------------
CString CStrObj::EncodeQuoted(LPCTSTR szMessage){
    CString s = szMessage;
    return( EncodeQuoted(s) );
}
CString CStrObj::EncodeQuoted(CString szMessage){
    CString s;
    char *buf;
    char bf[8];
    int i,n;
    s = "";
    n = szMessage.GetLength();
    buf = (char*)malloc( n+20 );
    strcpy(buf,LPCTSTR(szMessage) );
    for(i=0;i<n;i++){
        int b;
        b = (int)(buf[i] & 0x00ff);
        if( (b<33)||(b>127)||(b==61) ){
            s += "=";
            wsprintf(bf,"%.2x",b);
            s += bf;
        }else{
            wsprintf(bf,"%c",b);
            s += bf;
        }
    }
    free(buf);
    return s;
}

//-------------------------------------------------
// JIS <= => SJIS 変換
int CStrObj::SJis2Jis(int *ph,int *pl){ // HiByte , LowByte
    int n;
    if( *ph <= 0x9f){
        if(*pl < 0x9f)    *ph = (*ph << 1)-0xe1;
        else             *ph = (*ph << 1)-0xe0;
    }else{
        if(*pl < 0x9f)    *ph = (*ph << 1)-0x161;
        else             *ph = (*ph << 1)-0x160;
    }
    if        (*pl < 0x7f) *pl -= 0x1f;
    else if (*pl < 0x9f) *pl -= 0x20;
    else                 *pl -= 0x7e;
    n = (*ph << 8 ) | *pl;
    return n;
}
//------------------------------------
CString CStrObj::Jis2SJis(CString s){
    return(Jis2SJis((LPSTR)LPCTSTR(s)));
}
CString CStrObj::Jis2SJis(LPSTR s){
    CString sRet;
    char *b,b1,b2,b3;
    BOOL bEsc = FALSE;
    BOOL bRome = FALSE;
    int k,i,n = strlen(s);
    b = (char*)malloc( n+16);
    ZeroMemory(b,n+16);
    for(k=i=0;i<n;i++,k++){
        b1 = s[i]; b2 = s[i+1]; b3=s[i+2];
        if( b1 == 0x1b ) {
            if((b2 == '(')&&(b3=='J'))    bRome=(bRome==TRUE)?FALSE:TRUE;
            else if((b2 == '(')&&(b3=='B'))    bRome=(bRome==TRUE)?FALSE:TRUE;
            else if((b2 == '$')&&(b3=='B'))    bEsc = (bEsc==TRUE)?FALSE:TRUE;
            else if((b2 == '$')&&(b3=='@'))    bEsc = (bEsc==TRUE)?FALSE:TRUE;
            b1 = s[i+3]; b2 = s[i+4];
            if(bRome==TRUE){
                    b[k]=b1; i+=3;
            }else{    
                if( bEsc == FALSE){
                    b[k]=b1; i+=3;
                }else{
                    int a1,a2;
                    a1 = b1; a2 = b2;
                    Jis2SJis(&a1,&a2);
                    b[k++]=a1;
                    b[k ]=a2;
                    i+=4;
                }
            }
        }else {
            if(bRome==TRUE){
                    b[k]=b1;
            }else{
                if( bEsc == FALSE){
                    b[k]=b1;
                }else{
                    int a1,a2;
                    a1 = b1; a2 = b2;
                    Jis2SJis(&a1,&a2);
                    b[k++]=a1;
                    b[k ]=a2;
                    i++;
                }
            }
        }
    }
    sRet = b;
    free(b);
    return sRet;
}
//-------------------------------------------------
CString CStrObj::DecodeBase64(CString s){
    return( DecodeBase64(LPCTSTR(s)));
}
char CStrObj::DecodeBase64(char c){ // decode charcode to 6bit data
    if         ((c>='A')&&(c<='Z')) c = c-'A';
    else if    ((c>='a')&&(c<='z')) c = c-'a' + 26;
    else if    ((c>='0')&&(c<='9')) c = c-'0' + 52;
    else if (c=='+') c=62;
    else if (c=='/') c=63;
    return c;
}
CString CStrObj::DecodeBase64(LPSTR s){
    CString sRet;
    long d;
    int i,n;
    sRet = "";
    d = 0;
    n = strlen(s);
    for(i=0;i<n;i+=4){
        char b,b1[6];
        d=0;
        b = DecodeBase64( s[i+0] ); d |= b & 0x00ff; d<<=6;
        b = DecodeBase64( s[i+1] ); d |= b & 0x00ff; d<<=6;
        b = DecodeBase64( s[i+2] ); d |= b & 0x00ff; d<<=6;
        b = DecodeBase64( s[i+3] ); d |= b & 0x00ff;
        ZeroMemory(b1,6);
        b1[2] = d & 0x00ff; d>>=8;
        b1[1] = d & 0x00ff; d>>=8;
        b1[0] = d & 0x00ff;
        sRet += b1;
    }
    {    // delete last '='
        char buf[1024];
        strcpy(buf,LPCTSTR(sRet));
        if(( buf[ strlen(buf)-1] )=='=')buf[ strlen(buf)-1]=0;
        if(( buf[ strlen(buf)-1] )=='=')buf[ strlen(buf)-1]=0;
        sRet = buf;
    }
    return sRet;
}
//-------------------------------------------------

CString CStrObj::DecodeQuotedPrintable(CString s){
    return(DecodeQuotedPrintable(LPCTSTR(s)));
}
CString CStrObj::DecodeQuotedPrintable(LPSTR s){
    CString s2;
    int i,n;
    n = strlen(s);
    for(i=0;i<n;i++){
        if( s[i]=='='){
            char b1,b2,c[2];
            c[0] = 0; b1 = s[i+1]; b2=s[i+2]; i+=2;
            if         (b1>='a')    b1 = b1 - 'a' +10;
            else if     (b1>='A')    b1 = b1 - 'A' +10;
            else                 b1 = b1 - '0';
            if         (b2>='a')    b2 = b2 - 'a' +10;
            else if     (b2>='A')    b2 = b2 - 'A' +10;
            else                 b2 = b2 - '0';
            c[0] = (b1<<4) | b2; c[1]=0;
            s2 += c;
        }else {
            char b[2]; b[1]=0; b[0]=s[i];
            s2 += b;
        }
    }
    return s2;
}
//----------------------------------------
CString CStrObj::DecodeRFC1522(CString s){
    return ( DecodeRFC1522(LPCTSTR(s)));
};
CString CStrObj::DecodeRFC1522(LPSTR s){
    char *b,b1,rfc[1024];
    CString sRet;
    int i,n = strlen(s);
    BOOL bRFC = FALSE;
    int nMode = 0; // 0 : quoted printable 1:Base64
    b = (char*)malloc( n+16);
    ZeroMemory(b,n+16);
    for(i=0;i<n;i++){
        b1 = s[i];
        if( bRFC==FALSE){
            ZeroMemory(rfc,1024);
            if( strncmp(s+i,"=?us-ascii?Q?",13)==0){bRFC=TRUE; nMode=0; i+=12; continue;}
            if( strncmp(s+i,"=?US-ASCII?Q?",13)==0){bRFC=TRUE; nMode=0; i+=12; continue;}
            if( strncmp(s+i,"=?us-ascii?B?",13)==0){bRFC=TRUE; nMode=1; i+=12; continue;}
            if( strncmp(s+i,"=?US-ASCII?B?",13)==0){bRFC=TRUE; nMode=1; i+=12; continue;}
            if( strncmp(s+i,"=?iso-8859-1?Q?",15)==0){bRFC=TRUE; nMode=0; i+=14; continue;}
            if( strncmp(s+i,"=?ISO-8859-1?Q?",15)==0){bRFC=TRUE; nMode=0; i+=14; continue;}
            if( strncmp(s+i,"=?iso-8859-2?Q?",15)==0){bRFC=TRUE; nMode=0; i+=14; continue;}
            if( strncmp(s+i,"=?ISO-8859-2?Q?",15)==0){bRFC=TRUE; nMode=0; i+=14; continue;}
            if( strncmp(s+i,"=?iso-8859-1?B?",15)==0){bRFC=TRUE; nMode=1; i+=14; continue;}
            if( strncmp(s+i,"=?ISO-8859-1?B?",15)==0){bRFC=TRUE; nMode=1; i+=14; continue;}
            if( strncmp(s+i,"=?iso-8859-2?B?",15)==0){bRFC=TRUE; nMode=1; i+=14; continue;}
            if( strncmp(s+i,"=?ISO-8859-2?B?",15)==0){bRFC=TRUE; nMode=1; i+=14; continue;}
            if( strncmp(s+i,"=?iso-2022-jp?B?",16)==0){bRFC=TRUE; nMode=1; i+=15; continue;}
            if( strncmp(s+i,"=?ISO-2022-JP?B?",16)==0){bRFC=TRUE; nMode=1; i+=15; continue;}
            {
                char c[2]; c[1]=0; c[0]=b1;
                strcat(b,c);
            }
        }else{
            if((b1=='?')&&(bRFC==TRUE)){ // Convert and add rfc string
                bRFC=FALSE;
                // for debug
                if(nMode==0){strcat(b,DecodeQuotedPrintable(rfc)); i++;} // Quoted printable
                else if(nMode==1){
                    strcat(b,DecodeBase64(rfc)); i++;
                }
                else strcat(b,rfc);
            }else{
                char c[2]; c[1]=0; c[0]=b1;
                if(bRFC==TRUE){
                    strcat(rfc,c);
                }else{
                    strcat(b,c);
                }
            }
        }
    }
    sRet = b;
    free(b);
    return sRet;
};

int CStrObj::Jis2SJis(int *ph,int *pl){ // HiByte , LowByte
    int n;
    if( *ph & 1){
        if( *pl<0x60 )    *pl += 0x1f;
        else             *pl += 0x20;
    }else                 *pl += 0x7e;
    if(*ph<0x5f)        *ph = (*ph + 0xe1 ) >> 1;
    else                 *ph = (*ph + 0x161 ) >> 1;
    n = (*ph<<8) | *pl;
    return n;
};

//-------------------------------------------------

LPSTR CStrObj::ReadLine(CFile *cf){
    static char buf[1024];
    char b=0;
    int i,j;
    ZeroMemory(buf,1024);
    i = 0;
    while(1){
        try{
            cf->Read(&b,sizeof(char));
            if(b==0) return NULL;
            if(b==0x0d){cf->Read(&b,sizeof(char));/*cf->Read(&b,sizeof(char));*/break;}
            if(b==0x0a){cf->Read(&b,sizeof(char));/*cf->Read(&b,sizeof(char));*/break;}
            j = b; j&=0x00ff;
            if ( (j>=0x80) && (j<0x00a1) ){
                buf[i++]=b; cf->Read(&b,sizeof(char));
            }else if( j>=0x00e0){
                buf[i++]=b; cf->Read(&b,sizeof(char));
            }
            buf[i++]=b;
        }
        catch(CFileException e){ return NULL;
        }
    }
    return (LPSTR)buf;
}
//-------------------------------------------------
int CStrObj::Count(LPSTR src,WORD n){ // 全角半角を区別し含まれる文字コードの数を返す
    int i,j,k;
    j = strlen(src);
    for(k=i=0;i<j;i++){
        WORD *d = (WORD*)(src+i);
        if( ((*d&0x000ff)>= 0x80 ) &&((*d&0x000ff)< 0xA1)    ){if(*d==n)k++; i++; }
        else if( (*d&0x000ff)>= 0xe0 ) {if(*d==n)k++; i++;}
        else if( (((WORD)(src[i]))&0x00ff) ==n) k++;
    }
    return k;
}
//-------------------------------------------------
int CStrObj::StrLen(LPSTR src){
    int i,j,k;
    j = strlen(src);
    for(k=i=0;i<j;i++){
        WORD *d = (WORD*)(src+i);
        if( ((*d&0x000ff)>= 0x80 ) &&((*d&0x000ff)< 0xA1)    ){k++; i++; }
        else if( (*d&0x000ff)>= 0xe0 ) {k++; i++;}
        else k++;
    }
    return k;
}
int CStrObj::StrCmpWild(LPSTR s_src1,LPSTR s_src2,int length){
    char *src1,*src2;
    WORD *wx1,*wx2;
    int i,j,k;
    int s1,s2;

    src1 = (char*)malloc(strlen(s_src1) + 2);
    src2 = (char*)malloc(strlen(s_src2) + 2);

    strcpy(src1,s_src1);
    strcpy(src2,s_src2);

    s1 = strlen(src1)+4;
    s2 = strlen(src2)+4;

    wx1 = (WORD*)malloc( (s1+4) * sizeof(WORD) );
    wx2 = (WORD*)malloc( (s2+4) * sizeof(WORD) );

    ZeroMemory(wx1,(s1+4) * sizeof(WORD));
    ZeroMemory(wx2,(s2+4) * sizeof(WORD));
    // convert to Wide src1
    j = s1;
    for(k=i=0;i<j;i++){
        WORD *d = (WORD*)(src1+i);
        if( ((*d&0x000ff)>= 0x80 ) &&((*d&0x000ff)< 0xA1)    ){wx1[k++] = *d; i++; }
        else if( (*d&0x000ff)>= 0xe0 ) {wx1[k++] = *d; i++;}
        else wx1[k++] = src1[i];
    }
    // convert to Wide src2
    j = s2;
    for(k=i=0;i<j;i++){
        WORD *d = (WORD*)(src2+i);
        if( ((*d&0x000ff)>= 0x80 ) &&((*d&0x000ff)< 0xA1)    ){wx2[k++] = *d; i++; }
        else if( (*d&0x000ff)>= 0xe0 ) {wx2[k++] = *d; i++;}
        else wx2[k++] = src2[i];
    }
    // length setting
    if( length != -1 ){
        wx1[length] = 0;
        wx2[length] = 0;
    }
    // Wildcard
    j = s1;
    if(j>(int)s2)j=s2;
    for(i=0;i<j;i++){
        if( wx1[i]=='?' ) wx1[i]=wx2[i];
        if( wx2[i]=='?' ) wx2[i]=wx1[i];
        if( wx1[i]==0x4881 ) wx1[i]=wx2[i];
        if( wx2[i]==0x4881 ) wx2[i]=wx1[i];
    }
    // compare wx1,wx2
    i=0;
    k = 0;
    while(1){
        if( wx1[i] < wx2[i] ) { k=-1; break;}
        if( wx1[i] > wx2[i] ) { k= 1; break;}
        if((wx1[i]==0)&&(wx2[i]==0) ) {k=0; break;}
        if(wx1[i]==0) { k = 1; break; }
        if(wx2[i]==0) { k =-1; break; }
        i++;
    }
    free(src1);
    free(src2);
    free(wx1);
    free(wx2);
    return k;
}
//-------------------------------------------------
int CStrObj::StrCmpStartEx(LPSTR src1,LPSTR src2){
    int a,i,j,k=-1;
    j = strlen(src2);
    for(a=i=0;i<j;i++){
        if( a < StrCmpLen(src1,src2+i))
            { k=i; a=StrCmpLen(src1,src2+i);}
    }
    return k;
}
int CStrObj::StrCmpLenEx(LPSTR src1,LPSTR src2){
    int a,i,j;
    j = strlen(src2);
    for(a=i=0;i<j;i++){
        if( a < StrCmpLen(src1,src2+i))a=StrCmpLen(src1,src2+i);
    }
    return a;
}
int CStrObj::StrCmpLen(LPSTR src1,LPSTR src2){
    LPSTR p1 = src1;
    LPSTR p2 = src2;
    int i,j;
    j=strlen(src1);
    for(i=0;i<j;i++,p1++,p2++){
        if(*p1!=*p2)break;
    }
    return i;   
};
//-------------------------------------------------

void CStrObj::ZipSJis2Asc    (LPSTR srcdest){ // 全角郵便番号を半角へ、半角入力OK、7桁の場合ハイフン挿入
    char buf[1024];
    ZipSJis2Asc(srcdest,buf);
    strcpy(srcdest,buf);
}
void CStrObj::SujiSJis2Asc    (LPSTR srcdest){ // 全角数字(ハイフン)を半角へ、半角入力OK
    char buf[1024];
    SujiSJis2Asc(srcdest,buf);
    strcpy(srcdest,buf);
}
void CStrObj::SujiSJis2Asc    (LPSTR buf,LPSTR buf2){ // 全角数字(ハイフン)を半角へ、半角入力OK
    char *p2;
    // 半角化
//    GetDlgItemText(IDC_EDIT1,buf,256);
    short i,j,*p;
    long pp;
    if(buf==NULL){ strcpy(buf2,""); return;}
    if(strlen(buf)==NULL){ strcpy(buf2,""); return;}

    p2 = buf2;
    j=strlen(buf);
    for(i=0;i<j;i++){
        p=(short*)(buf + i);
        pp=*p;
        switch(pp&0x0ffff){
        case 0x4081 : *p2++=' '; i++; break;
        case 0x6082 : *p2++='A'; i++; break;
        case 0x6182 : *p2++='B'; i++; break;
        case 0x6282 : *p2++='C'; i++; break;
        case 0x6382 : *p2++='D'; i++; break;
        case 0x6482 : *p2++='E'; i++; break;
        case 0x6582 : *p2++='F'; i++; break;
        case 0x6682 : *p2++='G'; i++; break;
        case 0x6782 : *p2++='H'; i++; break;
        case 0x6882 : *p2++='I'; i++; break;
        case 0x6982 : *p2++='J'; i++; break;
        case 0x6a82 : *p2++='K'; i++; break;
        case 0x6b82 : *p2++='L'; i++; break;
        case 0x6c82 : *p2++='M'; i++; break;
        case 0x6d82 : *p2++='N'; i++; break;
        case 0x6e82 : *p2++='O'; i++; break;
        case 0x6f82 : *p2++='P'; i++; break;
        case 0x7082 : *p2++='Q'; i++; break;
        case 0x7182 : *p2++='R'; i++; break;
        case 0x7282 : *p2++='S'; i++; break;
        case 0x7382 : *p2++='T'; i++; break;
        case 0x7482 : *p2++='U'; i++; break;
        case 0x7582 : *p2++='V'; i++; break;
        case 0x7682 : *p2++='W'; i++; break;
        case 0x7782 : *p2++='X'; i++; break;
        case 0x7882 : *p2++='Y'; i++; break;
        case 0x7982 : *p2++='Z'; i++; break;
        case 0x8182 : *p2++='a'; i++; break;
        case 0x8282 : *p2++='b'; i++; break;
        case 0x8382 : *p2++='c'; i++; break;
        case 0x8482 : *p2++='d'; i++; break;
        case 0x8582 : *p2++='e'; i++; break;
        case 0x8682 : *p2++='f'; i++; break;
        case 0x8782 : *p2++='g'; i++; break;
        case 0x8882 : *p2++='h'; i++; break;
        case 0x8982 : *p2++='i'; i++; break;
        case 0x8a82 : *p2++='j'; i++; break;
        case 0x8b82 : *p2++='k'; i++; break;
        case 0x8c82 : *p2++='l'; i++; break;
        case 0x8d82 : *p2++='m'; i++; break;
        case 0x8e82 : *p2++='n'; i++; break;
        case 0x8f82 : *p2++='o'; i++; break;
        case 0x9082 : *p2++='p'; i++; break;
        case 0x9182 : *p2++='q'; i++; break;
        case 0x9282 : *p2++='r'; i++; break;
        case 0x9382 : *p2++='s'; i++; break;
        case 0x9482 : *p2++='t'; i++; break;
        case 0x9582 : *p2++='u'; i++; break;
        case 0x9682 : *p2++='v'; i++; break;
        case 0x9782 : *p2++='w'; i++; break;
        case 0x9882 : *p2++='x'; i++; break;
        case 0x9982 : *p2++='y'; i++; break;
        case 0x9a82 : *p2++='z'; i++; break;

        case 0x7c81 : *p2++='-'; i++; break;
        case 0x5b81 : *p2++='ー'; i++; break;
        case 0x4581 : *p2++='・'; i++; break;
        case 0x4481 : *p2++='.'; i++; break;

        case 0x7B81 : *p2++='+'; i++; break;
        case 0x9681 : *p2++='*'; i++; break;
        case 0x5E81 : *p2++='/'; i++; break;


        case 0x4981 : *p2++='!'; i++; break;
        case 0x6881 : *p2++='"'; i++; break;
        case 0x9481 : *p2++='#'; i++; break;
        case 0x9081 : *p2++='$'; i++; break;
        case 0x9381 : *p2++='%'; i++; break;
        case 0x9581 : *p2++='&'; i++; break;
        case 0x6681 : *p2++=0x27; i++; break;
        case 0x6981 : *p2++='('; i++; break;

        case 0x6a81 : *p2++=')'; i++; break;
        case 0x8181 : *p2++='='; i++; break;
        case 0x6281 : *p2++='|'; i++; break;
        case 0x8f81 : *p2++=0x5c; i++; break;
        case 0x4881 : *p2++='?'; i++; break;
        case 0x5181 : *p2++='_'; i++; break;
        case 0x6f81 : *p2++='{'; i++; break;

        case 0x7081 : *p2++='}'; i++; break;
        case 0x9781 : *p2++='@'; i++; break;
        case 0x4781 : *p2++=';'; i++; break;
        case 0x4681 : *p2++=':'; i++; break;
        case 0x8381 : *p2++='<'; i++; break;
        case 0x8481 : *p2++='>'; i++; break;
        case 0x4d81 : *p2++='`'; i++; break;

        case 0x4f82 : *p2++='0'; i++; break;
        case 0x5082 : *p2++='1'; i++; break;
        case 0x5182 : *p2++='2'; i++; break;
        case 0x5282 : *p2++='3'; i++; break;
        case 0x5382 : *p2++='4'; i++; break;
        case 0x5482 : *p2++='5'; i++; break;
        case 0x5582 : *p2++='6'; i++; break;
        case 0x5682 : *p2++='7'; i++; break;
        case 0x5782 : *p2++='8'; i++; break;
        case 0x5882 : *p2++='9'; i++; break;

        case 0x4083 : *p2++='ァ'; i++; break;
        case 0x4283 : *p2++='ィ'; i++; break;
        case 0x4483 : *p2++='ゥ'; i++; break;
        case 0x4683 : *p2++='ェ'; i++; break;
        case 0x4883 : *p2++='ォ'; i++; break;
        case 0x8383 : *p2++='ャ'; i++; break;
        case 0x8583 : *p2++='ュ'; i++; break;
        case 0x8783 : *p2++='ョ'; i++; break;
        case 0x6283 : *p2++='ッ'; i++; break;
        case 0x9683 : *p2++='ケ'; i++; break;

        case 0x4183 : *p2++='ア'; i++; break;
        case 0x4383 : *p2++='イ'; i++; break;
        case 0x4583 : *p2++='ウ'; i++; break;
        case 0x4783 : *p2++='エ'; i++; break;
        case 0x4983 : *p2++='オ'; i++; break;
        case 0x4a83 : *p2++='カ'; i++; break;
        case 0x4c83 : *p2++='キ'; i++; break;
        case 0x4e83 : *p2++='ク'; i++; break;
        case 0x5083 : *p2++='ケ'; i++; break;
        case 0x5283 : *p2++='コ'; i++; break;

        case 0x5483 : *p2++='サ'; i++; break;
        case 0x5683 : *p2++='シ'; i++; break;
        case 0x5883 : *p2++='ス'; i++; break;
        case 0x5a83 : *p2++='セ'; i++; break;
        case 0x5c83 : *p2++='ソ'; i++; break;
        case 0x5e83 : *p2++='タ'; i++; break;
        case 0x6083 : *p2++='チ'; i++; break;
        case 0x6383 : *p2++='ツ'; i++; break;
        case 0x6583 : *p2++='テ'; i++; break;
        case 0x6783 : *p2++='ト'; i++; break;

        case 0x6983 : *p2++='ナ'; i++; break;
        case 0x6a83 : *p2++='ニ'; i++; break;
        case 0x6b83 : *p2++='ヌ'; i++; break;
        case 0x6c83 : *p2++='ネ'; i++; break;
        case 0x6d83 : *p2++='ノ'; i++; break;

        case 0x6e83 : *p2++='ハ'; i++; break;
        case 0x7183 : *p2++='ヒ'; i++; break;
        case 0x7483 : *p2++='フ'; i++; break;
        case 0x7783 : *p2++='ヘ'; i++; break;
        case 0x7a83 : *p2++='ホ'; i++; break;

        case 0x7d83 : *p2++='マ'; i++; break;
        case 0x7e83 : *p2++='ミ'; i++; break;
        case 0x8083 : *p2++='ム'; i++; break;
        case 0x8183 : *p2++='メ'; i++; break;
        case 0x8283 : *p2++='モ'; i++; break;
       
        case 0x8483 : *p2++='ヤ'; i++; break;
        case 0x8683 : *p2++='ユ'; i++; break;
        case 0x8883 : *p2++='ヨ'; i++; break;
        case 0x8f83 : *p2++='ワ'; i++; break;
        case 0x9383 : *p2++='ン'; i++; break;

        case 0x8983 : *p2++='ラ'; i++; break;
        case 0x8a83 : *p2++='リ'; i++; break;
        case 0x8b83 : *p2++='ル'; i++; break;
        case 0x8c83 : *p2++='レ'; i++; break;
        case 0x8d83 : *p2++='ロ'; i++; break;

        case 0xf082 : *p2++='ヲ'; i++; break;

        case 0x9483 : *p2++='ウ'; *p2++='゙' ; i++; break;

        case 0x4b83 : *p2++='カ'; *p2++='゙' ; i++; break;
        case 0x4d83 : *p2++='キ'; *p2++='゙'; i++; break;
        case 0x4f83 : *p2++='ク'; *p2++='゙'; i++; break;
        case 0x5183 : *p2++='ケ'; *p2++='゙'; i++; break;
        case 0x5383 : *p2++='コ'; *p2++='゙'; i++; break;
        case 0x5583 : *p2++='サ'; *p2++='゙'; i++; break;
        case 0x5783 : *p2++='シ'; *p2++='゙'; i++; break;
        case 0x5983 : *p2++='ス'; *p2++='゙'; i++; break;
        case 0x5b83 : *p2++='セ'; *p2++='゙'; i++; break;
        case 0x5d83 : *p2++='ソ'; *p2++='゙'; i++; break;

        case 0x5f83 : *p2++='タ'; *p2++='゙'; i++; break;
        case 0x6183 : *p2++='チ'; *p2++='゙'; i++; break;
        case 0x6483 : *p2++='ツ'; *p2++='゙'; i++; break;
        case 0x6683 : *p2++='テ'; *p2++='゙'; i++; break;
        case 0x6883 : *p2++='ト'; *p2++='゙'; i++; break;

        case 0x6f83 : *p2++='ハ'; *p2++='゙'; i++; break;
        case 0x7283 : *p2++='ヒ'; *p2++='゙'; i++; break;
        case 0x7583 : *p2++='フ'; *p2++='゙'; i++; break;
        case 0x7883 : *p2++='ヘ'; *p2++='゙'; i++; break;
        case 0x7b83 : *p2++='ホ'; *p2++='゙'; i++; break;

        case 0x7083 : *p2++='ハ'; *p2++='゚'; i++; break;
        case 0x7383 : *p2++='ヒ'; *p2++='゚'; i++; break;
        case 0x7683 : *p2++='フ'; *p2++='゚'; i++; break;
        case 0x7983 : *p2++='ヘ'; *p2++='゚'; i++; break;
        case 0x7c83 : *p2++='ホ'; *p2++='゚'; i++; break;

        default :
            if( ((pp&0x000ff)>= 0x80 ) &&((pp&0x000ff)< 0xA1)     )*p2++ = buf[i++];
            else if( (pp&0x000ff)>= 0xe0 )
                *p2++ = buf[i++];
            *p2++ = buf[i];
        }
    }*p2=0;
//    SetDlgItemText(IDC_EDIT1,buf2);
}
void CStrObj::ZipSJis2Asc(LPSTR buf,LPSTR buf2){
    SujiSJis2Asc(buf,buf2);
    if(strlen(buf2)==0) return;
    if(buf2[3]=='ー')buf2[3]='-';
    if(strlen(buf2)==5){
        char *p=strchr(buf2,'-');
        if (p==NULL){
            char b1[16],b2[16];
            strcpy(b2,buf2+3);
            strcpy(b1,buf2); b1[3]=0; strcat(b1,"-"); strcat(b1,b2);
            strcpy(buf2,b1);
        }
    }
    else if(strlen(buf2)==7){
        char *p=strchr(buf2,'-');
        if (p==NULL){
            char b1[16],b2[16];
            strcpy(b2,buf2+3);
            strcpy(b1,buf2); b1[3]=0; strcat(b1,"-"); strcat(b1,b2);
            strcpy(buf2,b1);
        }
    }
}
//-------------------------------------------
//
void CStrObj::AllHankaku(LPSTR buf,LPSTR buf2){
    SujiSJis2Asc(buf,buf2);
    Hirakana2Hankaku(buf2);
}
void CStrObj::AllHankaku(LPSTR buf){
    SujiSJis2Asc(buf);
    Hirakana2Hankaku(buf);
}
//-------------------------------------------
//
void CStrObj::Hirakana2Hankaku(LPSTR srcdest){
    char buf[1024];
    Hirakana2Hankaku(srcdest,buf);
    strcpy(srcdest,buf);
}
void CStrObj::Hirakana2Hankaku(LPSTR buf,LPSTR buf2){
    char *p2;    // 半角化
    short i,j,*p;
    long pp;
    if(buf==NULL){ strcpy(buf2,""); return;}
    if(strlen(buf)==NULL){ strcpy(buf2,""); return;}

    p2 = buf2;
    j=strlen(buf);
    for(i=0;i<j;i++){
        p=(short*)(buf + i);
        pp=*p;
        switch(pp&0x0ffff){

        case 0xA082 : *p2++='ア'; i++; break;
        case 0xA282 : *p2++='イ'; i++; break;
        case 0xA482 : *p2++='ウ'; i++; break;
        case 0xA682 : *p2++='エ'; i++; break;
        case 0xA882 : *p2++='オ'; i++; break;
        case 0xA982 : *p2++='カ'; i++; break;
        case 0xAB82 : *p2++='キ'; i++; break;
        case 0xAD82 : *p2++='ク'; i++; break;
        case 0xAF82 : *p2++='ケ'; i++; break;
        case 0xB182 : *p2++='コ'; i++; break;
        case 0xB382 : *p2++='サ'; i++; break;
        case 0xB582 : *p2++='シ'; i++; break;
        case 0xB782 : *p2++='ス'; i++; break;
        case 0xB982 : *p2++='セ'; i++; break;
        case 0xBB82 : *p2++='ソ'; i++; break;
        case 0xBD82 : *p2++='タ'; i++; break;
        case 0xBF82 : *p2++='チ'; i++; break;
        case 0xC282 : *p2++='ツ'; i++; break;
        case 0xC482 : *p2++='テ'; i++; break;
        case 0xC682 : *p2++='ト'; i++; break;

        case 0xC882 : *p2++='ナ'; i++; break;
        case 0xC982 : *p2++='ニ'; i++; break;
        case 0xCA82 : *p2++='ヌ'; i++; break;

        case 0xCB82 : *p2++='ネ'; i++; break;
        case 0xCC82 : *p2++='ノ'; i++; break;
        case 0xCD82 : *p2++='ハ'; i++; break;
        case 0xD082 : *p2++='ヒ'; i++; break;
        case 0xD382 : *p2++='フ'; i++; break;
        case 0xD682 : *p2++='ヘ'; i++; break;
        case 0xD982 : *p2++='ホ'; i++; break;
        case 0xDC82 : *p2++='マ'; i++; break;

        case 0xDD82 : *p2++='ミ'; i++; break;
        case 0xDE82 : *p2++='ム'; i++; break;
        case 0xDF82 : *p2++='メ'; i++; break;
        case 0xE082 : *p2++='モ'; i++; break;
        case 0xE282 : *p2++='ヤ'; i++; break;
        case 0xE482 : *p2++='ユ'; i++; break;
        case 0xE682 : *p2++='ヨ'; i++; break;

        case 0xE782 : *p2++='ラ'; i++; break;
        case 0xE882 : *p2++='リ'; i++; break;
        case 0xE982 : *p2++='ル'; i++; break;
        case 0xEA82 : *p2++='レ'; i++; break;
        case 0xEB82 : *p2++='ロ'; i++; break;
        case 0xED82 : *p2++='ワ'; i++; break;
        case 0xf082 : *p2++='ヲ'; i++; break;
        case 0xF182 : *p2++='ン'; i++; break;

        case 0x9F82 : *p2++='ァ'; i++; break;
        case 0xA182 : *p2++='ィ'; i++; break;
        case 0xA382 : *p2++='ゥ'; i++; break;
        case 0xA582 : *p2++='ェ'; i++; break;
        case 0xA782 : *p2++='ォ'; i++; break;
        case 0xE182 : *p2++='ャ'; i++; break;
        case 0xE382 : *p2++='ュ'; i++; break;
        case 0xE582 : *p2++='ョ'; i++; break;
        case 0xC182 : *p2++='ッ'; i++; break;

        case 0x9483 : *p2++='ウ'; *p2++='゙' ; i++; break;
        case 0xAA82 : *p2++='カ'; *p2++='゙' ; i++; break;
        case 0xAC82 : *p2++='キ'; *p2++='゙'; i++; break;
        case 0xAE82 : *p2++='ク'; *p2++='゙'; i++; break;
        case 0xB082 : *p2++='ケ'; *p2++='゙'; i++; break;
        case 0xB282 : *p2++='コ'; *p2++='゙'; i++; break;
        case 0xB482 : *p2++='サ'; *p2++='゙'; i++; break;
        case 0xB682 : *p2++='シ'; *p2++='゙'; i++; break;
        case 0xB882 : *p2++='ス'; *p2++='゙'; i++; break;
        case 0xBA82 : *p2++='セ'; *p2++='゙'; i++; break;
        case 0xBC82 : *p2++='ソ'; *p2++='゙'; i++; break;
        case 0xBE82 : *p2++='タ'; *p2++='゙'; i++; break;
        case 0xC082 : *p2++='チ'; *p2++='゙'; i++; break;
        case 0xC382 : *p2++='ツ'; *p2++='゙'; i++; break;
        case 0xC582 : *p2++='テ'; *p2++='゙'; i++; break;
        case 0xC782 : *p2++='ト'; *p2++='゙'; i++; break;

        case 0xCE82 : *p2++='ハ'; *p2++='゙'; i++; break;
        case 0xD182 : *p2++='ヒ'; *p2++='゙'; i++; break;
        case 0xD482 : *p2++='フ'; *p2++='゙'; i++; break;
        case 0xD782 : *p2++='ヘ'; *p2++='゙'; i++; break;
        case 0xDA82 : *p2++='ホ'; *p2++='゙'; i++; break;
        case 0xCF82 : *p2++='ハ'; *p2++='゚'; i++; break;
        case 0xD282 : *p2++='ヒ'; *p2++='゚'; i++; break;
        case 0xD582 : *p2++='フ'; *p2++='゚'; i++; break;
        case 0xD882 : *p2++='ヘ'; *p2++='゚'; i++; break;
        case 0xDB82 : *p2++='ホ'; *p2++='゚'; i++; break;

        default :
            if( ((pp&0x000ff)>= 0x80 ) &&((pp&0x000ff)< 0xA1)     )*p2++ = buf[i++];
            else if( (pp&0x000ff)>= 0xe0 )
                *p2++ = buf[i++];
            *p2++ = buf[i];
        }
    }*p2=0;
}

Copyright (C) Kitaro 1998