프로젝트 진행중 파일 인코딩을 일괄 변경할 일이 생겼다. 파일이 좀 많아서 대략 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
혹시 나와 같은 고민을 하는 분들은 잘 활용하여 고민을 덜었으면 좋겠다.
'개발자의 정보 > Java & framework' 카테고리의 다른 글
Bean의 생성과 소멸에 발생되는 이벤트 (0) | 2020.02.13 |
---|---|
Java에서 Jackson 사용중 JSON data에 특정 field 제외 하거나 포함하기 (0) | 2020.02.13 |
Simplified sorting in List (0) | 2020.02.12 |
데이터 변경 알림 - @EntityListeners (0) | 2020.02.11 |
[JSP] forward된 페이지에서 request.getRequestURI 사용하기 (0) | 2020.02.01 |
Spring framework Page<T> 와 DataTables.js 연동 (0) | 2020.02.01 |
Spring @Controller 에서 파라미터로 배열 받기 (2) | 2020.02.01 |
[spring-boot-data-rest] How to expose IDs for all (0) | 2020.02.01 |
댓글