package com.coolservlets.beans.method;
import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;
/**
 * 2007-8-10 jyin at gomez dot com
 */
public class CharsetConvertor {

    public static void main(String[] args) {
        //String str = "è¿??¹å?";
        //String str = "strOut=2010@@4@@9@@08@@16@@??????äº?@@3???@@@@??¨è?? å°?å­?0@@@@@@@@@@???@@???@@@@???@@???@@@@@@@@@@???@@@@???@@@@@@@@@@@@???@@???@@???@@???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???@@???@@???@@???@@???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???@@???@@???@@???@@???@@@@@@???@@???@@???@@@@@@@@@@@@@@@@@@@@@@@@@@???@@@@@@@@@@@@@@@@@@@@???@@@@???@@@@???@@@@@@@@@@@@???@@???@@???@@???@@???@@@@@@@@@@???@@???@@@@@@@@@@@@@@???@@???@@???@@???@@???@@???@@@@@@@@@@@@@@@@@@@@@@@@???@@@@???@@@@@@???@@@@@@@@@@@@@@@@?";
        try {
            //File f = new File("D:/test.txt");
            //FileOutputStream fio = new FileOutputStream(f);
            //String s = gbToUtf8(str);
            //fio.write(s.getBytes("UTF-8"));
            //fio.close();
            //String st = utf8Togb2312(str);
            //System.out.println("st="+st);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void gbToUtf8OutputFile(String filePath,Vector vt) throws UnsupportedEncodingException {
        int loop = vt.size();
        try {
            File f = new File(filePath);
            FileOutputStream fio = new FileOutputStream(f);
            for(int i=0;i<loop;i++){
                String str =  (String)vt.elementAt(i);
                str = str + "\n";
                String s = gbToUtf8(str);
                fio.write(s.getBytes("UTF-8"));
            }
            fio.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String gbToUtf8(String str) throws UnsupportedEncodingException {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            String s = str.substring(i, i + 1);
            if (s.charAt(0) > 0x80) {
                byte[] bytes = s.getBytes("Unicode");
                String binaryStr = "";
                for (int j = 2; j < bytes.length; j += 2) {
                    // the first byte
                    String hexStr = getHexString(bytes[j + 1]);
                    String binStr = getBinaryString((Integer.valueOf(hexStr,16)).intValue());
                    binaryStr += binStr;
                    // the second byte
                    hexStr = getHexString(bytes[j]);
                    binStr = getBinaryString((Integer.valueOf(hexStr,16)).intValue());
                    binaryStr += binStr;
                }
                // convert unicode to utf-8
                String s1 = "1110" + binaryStr.substring(0, 4);
                String s2 = "10" + binaryStr.substring(4, 10);
                String s3 = "10" + binaryStr.substring(10, 16);
                byte[] bs = new byte[3];
                bs[0] = Integer.valueOf(s1, 2).byteValue();
                bs[1] = Integer.valueOf(s2, 2).byteValue();
                bs[2] = Integer.valueOf(s3, 2).byteValue();
                String ss = new String(bs, "UTF-8");
                sb.append(ss);
            } else {
                sb.append(s);
            }
        }
        return sb.toString();
    }

    public static String utf8Togb2312(String str){
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<str.length(); i++) {
            char c = str.charAt(i);
            switch (c) {
                case '+':
                    sb.append(' ');
                    break;
                case '%':
                    try {
                        sb.append((char)Integer.parseInt(
                                str.substring(i+1,i+3),16));
                    }
                    catch (NumberFormatException e) {
                        throw new IllegalArgumentException();
                    }
                    i += 2;
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        // Undo conversion to external encoding
        String result = sb.toString();
        String res=null;
        try{
            byte[] inputBytes = result.getBytes("8859_1");
            res= new String(inputBytes,"UTF-8");
        }
        catch(Exception e){}
        return res;
    }
    private static String getHexString(byte b) {
        String hexStr = Integer.toHexString(b);
        int m = hexStr.length();
        if (m < 2) {
            hexStr = "0" + hexStr;
        } else {
            hexStr = hexStr.substring(m - 2);
        }
        return hexStr;
    }

    private static String getBinaryString(int i) {
        String binaryStr = Integer.toBinaryString(i);
        int length = binaryStr.length();
        for (int l = 0; l < 8 - length; l++) {
            binaryStr = "0" + binaryStr;
        }
        return binaryStr;
    }
}
