最終更新日: 1998年 11月 05日 木曜日
CStrObjクラスは以前から他のサンプルに含まれていましたが今回から分離しました。
分離した理由は他のプロジェクト作成の折により広範囲な文字列操作クラスとして簡単に
アプリケーションを作成できるようにするためです。
今回分離する際に、電子メールで良く使われるBase64・QuotedーPrintable
コードの変換関数や、電子メールRFC1522拡張ヘッダーへの対応・RFC1468
コードでの電子メール本文の漢字コードの埋め込みに対応するようにしました。
現在Base64へのSJISからの変換はデバッグ&作成中ですが、Base64で埋め込まれた
RFC1522拡張ヘッダーの日本語解析はデバッグ済みです。こうしたアルゴリズムの多くは
JAVAへ移植可能なコードで記載しています。ポインターを使用している部分については
配列を使用するように変更するなどすれば比較的容易にJAVAへは移植できるでしょう。
主な拡張機能
![]() |
全角->半角への変換を行う |
![]() |
ワイルドカードが利用可能な文字列比較関数を追加する |
![]() |
Base64・Quoted-Printable・JIS->SJIS・等のデータを読めるように変更する |
今後の予定。
![]() |
Base64へのSJISコードの変換(現在デバッグ中) |
![]() |
UUENCODE などのバイナリファイルをテキストファイルへの変換など |
![]() |
半角コードを全角へ変換 |
/*
* 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__
#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