자바(Java)
Java charset detector: Solve Java String Encoding issue
SSaMKJ
2013. 3. 25. 14:48
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 ListgetTextLine(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 ) 필요에 따라 약간 변경하였다.