S-JISコードからUnicodeを求める
これまで、プログラムソースをUTF-8コードで書いたときに正常に日本語表示ができるように自作の日本語表示プログラムやフォントデータを修正してきました。このソースとデモプログラムはNDS Program Roomにアップしました。
今回は、プログラムソースはS-JISコードのままで、UTF-16やUTF-8のコード扱う方向でプログラムを作っていきたいと思います。
自作S-JIS/UTF-16(BE)変換テーブルを使ったコード変換
S-JISとUTF-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-JIS→UTF-16の文字列変換プログラムも書いています。
これで、もう一度、twitterに投稿するプログラムを作ってみたいと思います。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム