Java charset detector: Solve Java String Encoding issue
가끔 Java의 String Encoding 이슈 때문에 짜증났었는데, 한 방에 해결되었다.
변경하면 파일 뿐만 아니라 일반적인 스트링도 변형이 가능하기 때문에
사용하면 유용할 듯 하다.
-- 테스트 결과 완벽하지는 않다. 사용시 확인 후 사용 할 것.
Sometimes it makes me crazy that "Java String Encoding problems".
It works well.
It works for file stream and String stream.
P.S. It isn't perfect.
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 )
필요에 따라 약간 변경하였다.
FROM ( http://www.java2s.com/Code/Java/I18N/Howtoautodetectafilesencoding.htm )
I changed myself
댓글