文字コードの話(1)
nds用の自作文字表示プログラムはシフトJIS(SJIS)系で統一しています。Unicodeで統一した方が便利かもしれないと思い、文字コード体系を変えようかなと思っています。
そこで、文字コードを変更するプログラムを自作しました。自作DSプログラム向けですが、汎用的にも使えるとは思います。
Shift-JIS(SJIS)からUTF-16(BE)への変換
SJISとUnicodeは漢字について互換が無いと言ってよいと思います。元々、漢字を順番に並べた根拠が違っているので、対応付けができないと思います。そこで、変換テーブルを自作しました。
変換プログラムは下記です。半角文字も変換するため、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系のプログラム