/* jc.h 日本語コード変換ライブラリ Copyright (c) 1999- TaraChan */ #if !defined __JC_H #define __JC_H #include #define UNKNOWN -1 #define JIS 0 #define EUC 1 #define SJIS 2 #define ASCII 3 /*関数のプロトタイプ----------------------------------------------------------*/ int jconv(int o_code,char *in,char *out); /*【コード変換】 文字列inを、o_codeで指定された文字コードに変換して、文字列outに出力します。 o_codeには、JIS,EUC,SJISのいずれかを指定します。JISを指定しなければ、inと outは同じ物を指定できます。 戻り値は、成功の場合には0、サポートしていないコードのときには正値、その他の 異常時には負値を返します。 */ int kanji_code(unsigned char *s); /*【コードの判別】 文字列sに使われている漢字コードを判別します。 戻り値は、JIS, SJIS, EUC, ASCII, UNKNOWNのいずれかになります。 */ int s_econv(unsigned char *c1, unsigned char *c2); int e_sconv(unsigned char *c1, unsigned char *c2); int e_jconv(unsigned char *c1, unsigned char *c2); int j_econv(unsigned char *c1, unsigned char *c2); int j_sconv(unsigned char *c1, unsigned char *c2); /*未作成*/ int s_jconv(unsigned char *c1, unsigned char *c2); /*未作成*/ /*【コードの変換】 1文字分(2バイト)の日本語コード(c1,c2)を変換します。 s_econv():ShiftJISからEUC。 e_sconv():EUCからShiftJIS。 e_jconv():EUCからJIS。 j_econv():JISからEUC。 戻り値は、変換できたら0、できなければそれ以外の値を返します。 */ /*----------------------------------------------------------------------------*/ int jconv(int o_code,char *in,char *out){ int i_code; int (*conv)(unsigned char *, unsigned char *); i_code=kanji_code(in); if (i_code==UNKNOWN) return(-1); if (i_code==ASCII){ /*変換の必要無し*/ if (in!=out)strcpy(out,in); return(0); } switch(i_code*3+o_code){ case 0: case 4: case 8: /*変換の必要無し*/ if (in!=out)strcpy(out,in); return(0); case 3: /*e_j*/ return(1); /*break;*/ case 6: /*s_j*/ return(1); /*break;*/ case 1: /*j_e*/ return(1); /*break;*/ case 7: /*s_e*/ conv=s_econv; break; case 2: /*j_s*/ return(1); /*break;*/ case 5: /*e_s*/ conv=e_sconv; break; default: return(-2); } while((*in)!='\0'){ if(!((*in)&0x80)){ *(out++)=*(in++); continue; } if(*(in+1)=='\0') break; *out=*in; *(out+1)=*(in+1); (*conv)(out,out+1); out+=2; in+=2; } *out='\0'; return(0); } int kanji_code(unsigned char *s){ int re_flag=ASCII; while(*s!='\0'){ if(*s==0x1b || *s==0x0e || *s==0x0f) return(JIS); if(!(*s&0x80)) { s++; continue; } if(0x81<=*s && *s<=0x9f) return(SJIS); if((0xa1<=*s && *s<=0xdf) || (0xf0<=*s && *s<=0xfe)) return(EUC); if(*(++s)<=0xa0) return(SJIS); /*2byte目をチェック*/ if(0xfd<=*s && *s<=0xfe) return(EUC); /*2byte目をチェック*/ re_flag=UNKNOWN; s++; /*判別できなかったので、次のワードへ*/ } return(re_flag); } int s_econv(unsigned char *c1, unsigned char *c2){ if(*c2<=0x9e){ *c1&=0x3f; *c1<<=1; *c1+=0x9f; if(*c2<=0x7e) (*c2)++; /*S-JISに7Fが無いため*/ *c2+=0x60; }else{ *c1&=0x3f; *c1<<=1; *c1+=0xa0; *c2+=0x02; } return(0); } int e_sconv(unsigned char *c1, unsigned char *c2){ /* 第2バイトの変換 */ if((*c1%2)==0) *c2-=0x02; else{ *c2-=0x61; if(*c2>0x7e) (*c2)++; } /* 第1バイトの変換 */ if(*c1<0xdf){ (*c1)++; *c1>>=1; *c1+=0x30; }else{ (*c1)++; *c1>>=1; *c1+=0x70; } return(0); } int e_jconv(unsigned char *c1, unsigned char *c2){ *c1 &= 0x7f; *c2 &= 0x7f; return(0); } int j_econv(unsigned char *c1, unsigned char *c2){ *c1 |= 0x80; *c2 |= 0x80; return(0); } #if 0 int j_sconv(unsigned char *c1, unsigned char *c2){ return(-1); } #endif #if 0 int s_jconv(unsigned char *c1, unsigned char *c2){ return(-1); } #endif /* 更新履歴 1999.08.02 ・制作開始。 1999.08.03 ・JIS以外の変換をサポート。 1999.08.04 ・JISとEUCの1文字変換をサポート。  エスケープシーケンス処理は無し。 1999.08.07 ・使用していない変数の除去。 */ #endif