Java charset detector: Solve Java String Encoding issue

가끔 Java의 String Encoding 이슈 때문에 짜증났었는데, 한 방에 해결되었다.
변경하면 파일 뿐만 아니라 일반적인 스트링도 변형이 가능하기 때문에
사용하면 유용할 듯 하다.

-- 테스트 결과 완벽하지는 않다. 사용시 확인 후 사용 할 것.
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.ArrayList;
import java.util.List;

public class CharsetDetector {
 
 public static List getTextLine(File f){
  
  List list = new ArrayList();
//  File f = new File("d:\\TITLE.csv");

        String[] charsetsToBeTested = {"MS949", "KSC5601", "EUC-KR", "x-windows-949", "UTF-8", "iso-8859-1"};

        Charset charset = detectCharset(f, charsetsToBeTested);

        if (charset != null) {
            try {
                InputStreamReader reader = new InputStreamReader(new FileInputStream(f), charset);
                BufferedReader br =  new BufferedReader(reader);
                String line;
                while((line = br.readLine()) != null){
                 System.out.println(line);
                 list.add(line);
                }
                reader.close();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }catch(IOException ioe){
                ioe.printStackTrace();
            }

        }else{
            System.out.println("Unrecognized charset.");
        }
  return list;
 }
 
 private static Charset detectCharset(File f, String[] charsets) {

        Charset charset = null;

        for (String charsetName : charsets) {
            charset = detectCharset(f, Charset.forName(charsetName));
            if (charset != null) {
                break;
            }
        }

        return charset;
    }
 
 private static Charset detectCharset(File f, Charset charset) {
        try {
            BufferedInputStream input = new BufferedInputStream(new FileInputStream(f));

            CharsetDecoder decoder = charset.newDecoder();
            decoder.reset();

            byte[] buffer = new byte[512];
            boolean identified = false;
            while ((input.read(buffer) != -1) && (!identified)) {
                identified = identify(buffer, decoder);
            }

            input.close();

            if (identified) {
                return charset;
            } else {
                return null;
            }

        } catch (Exception e) {
            return null;
        }
    }

    private static boolean identify(byte[] bytes, CharsetDecoder decoder) {
        try {
            decoder.decode(ByteBuffer.wrap(bytes));
        } catch (CharacterCodingException e) {
            return false;
        }
        return true;
    }
}



원문 ( http://www.java2s.com/Code/Java/I18N/Howtoautodetectafilesencoding.htm )
필요에 따라 약간 변경하였다.

+ Recent posts