○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++