본문 바로가기
개발자의 정보/Java & framework

자바로 파일 인코딩 확인하기 - Check the file encoding in Java language

by pastory 2020. 2. 1.

프로젝트 진행중 파일 인코딩을 일괄 변경할 일이 생겼다. 파일이 좀 많아서 대략 3천개 내외 정도 되나보다. 그래서 일괄 변경을 위해 간단한 프로그램을 만드는데 경천동지할 일이 발생한 것이었다.

 

이전 파일이 모두 euc-kr 인줄 알았는데 utf-8 이 섞였다. 이런.. 그렇다면 결국 파일의 encoding을 확인하고 해당 charset 설정을 해주어야 한다는 이야기다.

 

자바에서는 누구나 비슷한 고민을 해본다는 전제하에 분명 누군가가 비슷한 고민을 하고 미리 만들어 둔 모듈이 있을거라 생각했다. 검색.. 검색.. 구글링... 구글링... 흐흐흐 역시나 있다.

 

https://code.google.com/p/juniversalchardet/

위의 페이지에서 찾았다.

 

sourceforge 프로젝트도 있나보다.

http://jchardet.sourceforge.net/

 

그래서 얼른 jar 파일을 다운받아 build path 에 추가한 다음 테스트를 실행해 보았다.

public static String findFileEncoding(File file) throws IOException {
    byte[] buf = new byte[4096];
    java.io.FileInputStream fis = new java.io.FileInputStream(file);
 
    // (1)
    UniversalDetector detector = new UniversalDetector(null);
 
    // (2)
    int nread;
    while ((nread = fis.read(buf)) > 0 && !detector.isDone()) {
      detector.handleData(buf, 0, nread);
    }
    // (3)
    detector.dataEnd();
 
    // (4)
    String encoding = detector.getDetectedCharset();
    if (encoding != null) {
      System.out.println("Detected encoding = " + encoding);
    } else {
      System.out.println("No encoding detected.");
    }
 
    // (5)
    detector.reset();
    
    return encoding;
}

위의 메서드를 생성하고 encoding 을 받아 확인해본 결과 현재까지는 잘 동작하고 있다.

참고로 위의 페이지에서 설명하고 있는 지원되는 charset은 다음과 같다.

 

Encodings that can be detected

  • Chinese
    • ISO-2022-CN
    • BIG5
    • EUC-TW
    • GB18030
    • HZ-GB-23121
  • Cyrillic
    • ISO-8859-5
    • KOI8-R
    • WINDOWS-1251
    • MACCYRILLIC
    • IBM866
    • IBM855
  • Greek
    • ISO-8859-7
    • WINDOWS-1253
  • Hebrew
    • ISO-8859-8
    • WINDOWS-1255
  • Japanese
    • ISO-2022-JP
    • SHIFT_JIS
    • EUC-JP
  • Korean
    • ISO-2022-KR
    • EUC-KR
  • Unicode
    • UTF-8
    • UTF-16BE / UTF-16LE
    • UTF-32BE / UTF-32LE / X-ISO-10646-UCS-4-34121 / X-ISO-10646-UCS-4-21431
  • Others
    • WINDOWS-1252

 

혹시 나와 같은 고민을 하는 분들은 잘 활용하여 고민을 덜었으면 좋겠다.

 

댓글