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

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

文字コードの話(1)

nds用の自作文字表示プログラムはシフトJIS(SJIS)系で統一しています。Unicodeで統一した方が便利かもしれないと思い、文字コード体系を変えようかなと思っています。
そこで、文字コードを変更するプログラムを自作しました。自作DSプログラム向けですが、汎用的にも使えるとは思います。

Shift-JIS(SJIS)からUTF-16(BE)への変換

SJISUnicodeは漢字について互換が無いと言ってよいと思います。元々、漢字を順番に並べた根拠が違っているので、対応付けができないと思います。そこで、変換テーブルを自作しました。
変換プログラムは下記です。半角文字も変換するため、wbyteという引数を使って1バイトか2バイトかを渡します。Sjis2Utf16[]というテーブルを使います。

void  SJIS2UTF16( unsigned char* code, int wbyte )
{
long  sjis;
  if( wbyte==1 ){
    sjis = 2*(long)code[0];
  }
  else{
    sjis = 2*((long)code[1] + (long)code[0]*256);
  }
  code[0] = Sjis2Utf16[sjis];
  code[1] = Sjis2Utf16[sjis+1];
}

UTF-16(BE)からShift-JIS(SJIS)への変換

これも同様にテーブルを使います。上とは逆の変換テーブルになります。
変換プログラムは下記です。変換後半角文字となる文字もあるので、戻り値にバイト数を返します。2バイト文字なら2、半角文字なら1を返します。Utf162Sjis[]というテーブルを使います。

int  UTF162SJIS( unsigned char *code )
{
long  utf16;
  if( code[0]==0 && code[1]==0 ){  return( 1 );  }

  utf16 = 2*((long)code[1] + (long)code[0]*256);
  code[0] = Utf162Sjis[utf16];
  code[1] = Utf162Sjis[utf16+1];

  if( code[0]==0 ){
    code[0] = code[1];
    code[1] = 0;
    return( 1 );
  }
  return( 2 );
}

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

プログラムソースはアスキーコードがそのまま使えるUTF-8で書くことになるかと思います。UTF-16で書かれたソースをgccコンパイルするやり方を知らないだけという話もありますが・・・。ただし、フォントデータを作るには、可変バイトのUTF-8よりはUTF-16の方が楽そうなので、UTF-8からUTF-16(BE)への変換プログラムも作りました。自分でわかりやすいように書いています。変換効率を上げたい場合はソースを適当に変更してください。

void  UTF82UTF16( unsigned char *code )
{
  if( code[0]<0x80 ){
    code[1] = code[0];
    code[0] = 0;
  }
  else if( code[0]<0xe0 ){
    code[1] = (code[1] & 0x3f) + ((code[0] & 0x1f)<<6);
    code[0] = (code[0] & 0x1f)>>2;
  }
  else{
    code[0] = ((code[0] & 0xf)<<4) + ((code[1] & 0x3f)>>2);
    code[1] = ((code[1] & 0x3f)<<6) + (code[2] & 0x3f);
  }
}

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

反対にUTF-16(BE)からUTF-8に変換するプログラムです。UTF-8は可変長なので変換後のバイト数を戻り値にしています。

int  UTF162UTF8( unsigned char *code )
{
int  ec = 0;

  if( code[0]==0 && code[1]<0x80 ){
    code[0] = code[1];
    ec = 1;
  }
  else if( code[0]<0x8 ){
    code[0] = ((code[0]<<2 | code[1]>>6)&0x1f) + 0xc0;
    code[1] = (code[1]& 0x3f) + 0x80;
    ec = 2;
  }
  else{
    code[2] = (code[1]& 0x3f) + 0x80;
    code[1] = (((code[0]<<2)+(code[1]>>6))&0x3f) + 0x80;
    code[0] = (code[0]>>4) + 0xe0;
    ec = 3;
  }
  return(ec);
}


UTF-8は全て3バイトまでとしています。UTFコードの変換はここのサイト(UCSとUTF)を参考にしました。

これで、文字コードに関しては対応できると思います。今日はこの辺で・・・。

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

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

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