2011年8月15日月曜日

テキストファイルのコード変換

Microsoft社のWindowsのディスクにあるテキストファイル内の文字データのコードはShift_JISです。
このファイルを、そのままandroidシステム内のディレクトリにコピーすると、Shift_JISデータのままのファイルになってしまいます。
このことを何も知らずに、androidで当該ファイルを開くと文字化けが発生します。
androidシステムでは文字コードはUTF-8なのです。

この情報をandroid端末利用者に周知して文字化けを未然に防ぐことも一つの方法ですが、周知が行き届くとは限りません。また、利用者側でコード変換をするのは面倒です。

このため、androidアプリ側でコード変換を行います。サンプルのsourceを作成しましたので掲載しておきます。

入力のテキストファイルのコードが何であるか事前にはわかりません。このため、適正な復号が行えるまで、異なったコードで復号を試みることがポイントです。

動作内容:SDカードのルートディレクトリのsammm3.txtファイル内の文字データをandroid用のコードに変換して画面に表示します。


本文章を掲載後、プログラムに誤りを見つけましたので、修正後をテキストファイルのコード変換 その後に書いておきました。


/*
 * 参考になったサイト
 * http://www.ne.jp/asahi/hishidama/home/tech/java/Buffer.html
 * http://www.javadb.jp/Code.sd?id=53
 * http://blog.goo.ne.jp/xmldtp/e/b1fb4c01508e21a1325c41c3a44c7655
 * http://www.opensourcejavaphp.net/java/harmony/tests/api/java/nio/charset/CharsetTest.java.html
 */
public class CodeChangeActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        int iSize;
        File fSD, f;
        FileInputStream fs;
        byte[] ba;
        
        fSD = Environment.getExternalStorageDirectory();
        f = new File(fSD, "sammm3.txt");
        ba = new byte[6000];
        try{
            fs = new FileInputStream(f);
            iSize = fs.read(ba, 0, 6000);
            fs.close();
            
        }
        catch(FileNotFoundException e){
            return;
        }
        catch(IOException e){
            return;
        }
        
        int i;
        Charset charset;
        CharsetDecoder d;
        CoderResult r;
        CharBuffer cb;
        ByteBuffer bb;
        String[] sCharset = {"UTF-8", "UTF-16", "Shift_JIS"};


        bb = ByteBuffer.wrap(ba);
        cb = null;
        for(i=0; i<sCharset.length; i++){
            charset = Charset.forName(sCharset[i]);
            d = charset.newDecoder();
            cb = CharBuffer.allocate(iSize);
            r = d.decode(bb, cb, true);
            if(r.isError()==false) break;
            bb.rewind();
        }
        String s;
        TextView tv;
        if(i>=sCharset.length){
            s = "have no charset";
        }
        else{
            cb.rewind();
            s = cb.toString();
        }
        tv = (TextView)findViewById(R.id.MyText);
        tv.setText(s);
    }
}

0 件のコメント:

コメントを投稿