○JIS(ISO-2022-JP)からShift-JISに変換


#include <stdio.h>
#include <string>
#include <mbstring.h>


//JIS(ISO-2022-JP)からShift-JISに変換
//jis : 変換元 //sjis : 変換先
void JIS_SJIS(std::string*jis,std::string*sjis){
	unsigned int i=0;
	bool ConFlag=false;

	int iLen=jis->length()-1;

	while(i<iLen){
		if(jis[0][i]==0x1B){
			if((iLen-i)>3){
				if(jis[0][i+1]==0x24 && jis[0][i+2]==0x40){
					//2バイト文字の開始
					i=i+3;
					ConFlag=true;
				}
				if(jis[0][i+1]==0x24 && jis[0][i+2]==0x42){
					//2バイト文字の開始
					i=i+3;
					ConFlag=true;
				}
				if(jis[0][i+1]==0x28 && jis[0][i+2]==0x42){
					//ASCII文字の開始
					i=i+3;
					ConFlag=false;
				}
				if(jis[0][i+1]==0x28 && jis[0][i+2]==0x4A){
					//JISローマ字の開始
					i=i+3;
					ConFlag=false;
				}
			}
			if((iLen-i)>4){
				if(jis[0][i+1]==0x24 && jis[0][i+2]==0x28 && jis[0][i+3]==0x44){
					//2バイト文字の開始
					i=i+4;
					ConFlag=true;
				}
			}
			if((iLen-i)>6){
				if(jis[0][i+1]==0x26 && jis[0][i+2]==0x40 && jis[0][i+3]==0x1B && jis[0][i+4]==0x24 && jis[0][i+5]==0x42 ){
					//2バイト文字の開始
					i=i+6;
					ConFlag=true;
				}
			}
		}
		if(ConFlag){
			//2バイト文字の変換
			union Field
			{
				struct Bit
				{
					unsigned char H;
					unsigned char L;
				} bit;
				unsigned long WORD;
			} field;
			
			field.bit.H=jis[0][i+1];
			field.bit.L=jis[0][i];

			field.WORD =_mbcjistojms(field.WORD);

			char buff[3]="";
			buff[0]=field.bit.L;
			buff[1]=field.bit.H;
			sjis->append(buff);
			i=i+2;
		}else{
			//2バイト文字以外はそのままコピー
			char buff[2]="";
			buff[0]=jis[0][i++];
			sjis->append(buff);
		}
	}
}



int main(){
	std::string jis;
	std::string sjis;

	//JISコードの文をファイルから読み出し	
	FILE * fp;
	if((fp=fopen("test.html","r"))==NULL){
		//エラー処理
	}else{
		while(!feof(fp)){
			int c=fgetc(fp);
			char buff[2]="";
			buff[0]=c;
			jis.append(buff);
		}
		fclose(fp);
	}

	JIS_SJIS(&jis,&sjis);//JISからSJISに変換
	printf("%s\n",sjis.c_str());
	getchar();
	return 0;
}



▲トップページ > Windows と C++