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-16、UTF-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)コードに変換します // 変換は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文字コードに変更します // 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系のプログラム