コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

UTF-8コードをS-JISコードに変換

前回のブログで、XMLデータの内容を読み込む話を書きました。XMLデータを読み込む目的は「Yahoo!JAPANテキスト解析 Web API」から返ってくるXMLデータを解析したいからです。実際、「Yahoo!JAPANテキスト解析 Web API」から返ってくるXMLデータは、文字コードUTF-8です。今使っているプログラムは、S-JIS環境で使うように作っています。そこで、UTF-8コードをS-JISコードに変換するプログラムを作りました。
以前作成したS-JISからUTF-8変換の逆をしているだけですが、S-JISコードからUnicodeへの変換テーブルをそのまま使うと変換時間が掛かりそうなので、逆変換テーブルを用意しました。ただし、UnicodeにあってS-JIS(第一、二水準)に無いコードは変換できないので、'・'コードに変換します。

UTF-8からS-JIS

変換はUTF-8からUTF-16UTF-16(BE)からS-JISというふうに行います。プログラムを下記に示します。

変換テーブルを用いたUTF-16(BE) → S-JISの変換

//*********************************************
//  変換テーブルを使ってUTF-16→S-JISに文字コードを変換します
//*********************************************
long UTF162SJISTbl( long code )
{
 return( (((long)utf162sjis_bin[2*code])<<8) + (long)utf162sjis_bin[2*code+1] );
}

UTF-8からUTF-16(BE)への変換

//*********************************************
//  UTF-8コードをUTF-16(BE)コードに変換します
//  変換は1文字です
//  戻り値は変換後のコードバイト数
//*********************************************
void UTF82UTF16b( unsigned char *code )
{
 if( code[0]<0x80 ){
  //0xxxxxxx  00000000-0xxxxxxx
  code[0] = 0;
  code[1] = code[0];
  return;
 }
 else if( code[0]<0xE0 ){
  //110xxxxx-10yyyyyy  00000xxx-xxyyyyyy
  code[1] = ((code[0] & 0x1F)<<6) + (code[1] & 0x3F);
  code[0] = ((code[0] & 0x1F)>>2);
  return;
 }
 else{
  //1110xxxx-10yyyyyy-10zzzzzz  xxxxyyyy-yyzzzzzz
  code[0] = ((code[0] & 0xF)<<4) + ((code[1] & 0x3F)>>2);
  code[1] = ((code[1] & 0x3F)<<6) + (code[2] & 0x3F);
 }
 return;
}

UTF-8の文字列をS-JISの文字列に変換する

//**************************************************
//  UTF-8文字コードをS-JIS文字コードに変更します
//  code:変換する文字列, S-JISの最大バイト数
//**************************************************
void UTF82SJIS( unsigned char *code, int byte )
{
unsigned char kcode[4];
int  codebyte = 0;
long sjiscode = 0;
unsigned char *utf;

 utf = code;
 while( true ){
  if( *utf==0 ){
   code[codebyte] = 0;
   break;
  }
  
  if( *utf<0x80 ){
   code[codebyte] = *utf;
   codebyte++;
   utf++;
  }
  else if( *utf<0xE0 ){
   kcode[0] = utf[0];
   kcode[1] = utf[1];
   UTF82UTF16b( kcode );
   sjiscode = UTF162SJISTbl( (long)kcode[0]*256L + (long)kcode[1] );
   if( sjiscode<256 ){
    code[codebyte] = (unsigned char)sjiscode;
    utf += 2;
    codebyte ++;
   }
   else{
    code[codebyte] = (sjiscode>>8) & 0xFF;
    code[codebyte+1] = sjiscode & 0xFF;
    utf += 2;
    codebyte += 2;
   }
  }
  else{
   kcode[0] = utf[0];
   kcode[1] = utf[1];
   kcode[2] = utf[2];
   UTF82UTF16b( kcode );
   sjiscode = UTF162SJISTbl( (long)kcode[0]*256L + (long)kcode[1] );
   if( sjiscode<256 ){
    code[codebyte] = (unsigned char)sjiscode;
    utf += 3;
    codebyte ++;
   }
   else{
    code[codebyte] = (sjiscode>>8) & 0xFF;
    code[codebyte+1] = sjiscode & 0xFF;
    utf += 3;
    codebyte += 2;
   }
  }
 }
}

これで、「Yahoo!JAPANテキスト解析 Web API」を使うに際して必要な文字コード関連プログラムは、ほぼ作ることができたと思います。
今後はかな漢字変換プログラムをぼちぼち作っていきたいと思います。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム