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

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

S-JISコードからUnicodeを求める

これまで、プログラムソースをUTF-8コードで書いたときに正常に日本語表示ができるように自作の日本語表示プログラムやフォントデータを修正してきました。このソースとデモプログラムはNDS Program Roomにアップしました。

今回は、プログラムソースはS-JISコードのままで、UTF-16UTF-8のコード扱う方向でプログラムを作っていきたいと思います。

自作S-JIS/UTF-16(BE)変換テーブルを使ったコード変換

S-JISUTF-16(BE)のコード変換プログラムです。以前、ブログで書いたものよりシンプルになっています。

//*********************************************
//  変換テーブルを使ってSJIS→UTF16に文字コードを変換します
//*********************************************
long  SJIS2UTF16Tbl( long code )
{
  return( (((long)sjis2utf16_bin[2*code])<<8) + (long)sjis2utf16_bin[2*code+1] );
}

UTF-16(BE)コードをUTF-8コードに変換

UTF-16(BE)をUTF-8に変換するプログラムです。これは以前ブログで書いたものとほぼ同じだと思います。code[]は3バイト分確保しなければなりません。

//*********************************************
//  UTF-16(BE)コードをUTF-8コードに変換します
//  変換は1文字です
//  戻り値は変換後のコードバイト数
//*********************************************
int  UTF162UTF8b( unsigned char *code )
{
long  cd = (((long)code[0])<<8) + (long)code[1];

  if( cd<0x80 ){
    //00000000-0xxxxxxx  0xxxxxxx
    code[0] = code[1];
    return( 1 );
  }
  else if( cd<0x800 ){
    //00000xxx-xxyyyyyy  110xxxxx  10yyyyyy
    code[0] = 0xC0 + ((code[0] & 0x7)<<2) + ((code[1] & 0xC0)>>6);
    code[1] = 0x80 + (code[1] & 0x3f);
    return( 2 );
  }
  else{
    //xxxxyyyy-yyzzzzzz  1110xxxx  10yyyyyy  10zzzzzz  
    code[2] = 0x80 + (code[1]&0x3F);
    code[1] = 0x80 + ((code[1]&0xC0)>>6) + ((code[0]&0xF)<<2);
    code[0] = 0xE0 + ((code[0]&0xF0)>>4);
  }
  return( 3 );
}

S-JISの文字列をUTF-8コードの文字列に変換

S-JISの文字列をUTF-8コードの文字列に変換するプログラムです。ソースを見てもらえればわかると思いますが、一度UTF-16(BE)に変換した後、UTF-8に変換しています。

//**************************************************
//  SJIS文字コードをUTF-8文字コードに変更します
//  sjis:SJISの文字列, utf:UTF-8の文字列, UTF-8の最大バイト数
//**************************************************
int  SJIS2UTF8( unsigned char *sjis, unsigned char *utf, int byte )
{
unsigned char code[4];
int    codebyte = 0;
long  utf16code = 0;
long  fl;
int    c, i;

  while( true ){
    if( *sjis==0 ){
      utf[codebyte] =0;      
      break;
    }
    //半角か全角のチェック
    if( ( (*sjis>>7) & (1-(((*sjis&0x40)>>6)^((*sjis&0x20)>>5))) )==0 ){
      //半角だった
      utf16code = SJIS2UTF16Tbl( (long)*sjis );
      sjis++;
    }
    else{
      //SJIS文字の1バイト目だった
      fl = (long)*sjis * 256L;
      sjis++;
      utf16code = SJIS2UTF16Tbl( fl + (long)*sjis );
      sjis++;
    }
    
    code[0] = (unsigned char)(utf16code>>8);
    code[1] = (unsigned char)utf16code&0xFF;
    c = UTF162UTF8b( code );
    
    if( codebyte+c>=byte || utf16code==0 ){
      utf[codebyte] =0;
      break;
    }
    for( i=0; i<c; i++ ){
      utf[codebyte+i] = code[i];
    }
    codebyte += c;
  }
  return( codebyte );
}

S-JIS文字列からUTF-16文字列に変換するプログラムは、上のプログラムを見れば直ぐ作れると思いますので省略します。明日にでも、デモプログラムを公開したいと思いますので、そのソースにはS-JISUTF-16の文字列変換プログラムも書いています。

これで、もう一度、twitterに投稿するプログラムを作ってみたいと思います。

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

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

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