자바에서 파일의 문자 인코딩 감지


바이트 스트림에서 문자 인코딩을 자동으로 감지하는 신뢰할 만한 방법이 없다.
(출처: 카이 호스트만의 코어 자바 8)

juniversalchardet

프로그래밍 언어 별로 인코딩을 감지할 수 있는 오픈소스들이 있긴 하다. 자바에서는 juniversalchardet를 찾을 수 있었다. Mozilla의 인코딩 감지기인 "universalchardet"를 자바 버전으로 만든 것인데, 지금까지 나온 최종 버전은 1.0.3 이다. 최종 릴리스에서 자바 1.5와 호환된다는 노트가 있는 걸 보면, 오래 전부터 관리되고 있지 않은 듯.


감지할 수 있는 인코딩 종류

• Chinese
○ ISO-2022-CN
○ BIG-5
○ EUC-TW
○ GB18030
○ HZ-GB-2312
• 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-3412 / X-ISO-10646-UCS-4-2143
• Others
○ WINDOWS-1252

   

인코딩 감지 방법

먼저 파일에 BOM이 있는 지 확인한다. BOM이 있으면 그에 맞는 인코딩을 감지한다.
BOM이 없다면 감지할 수 있는 인코딩 종류에 해당하는 코드 포인트와 파일 내의 바이트들을 비교한다. 그 결과 특정 인코딩과 매칭되는 코드 포인트가 있는 경우 해당 인코딩으로 감지하는 방식인 것 같다.


테스트 결과

BOM(Byte Order Mark)가 있는 경우 결과는 정확하다. 그러나 파일에 BOM이 없다면 실무에 적용하기는 어렵다는 생각이 든다. 테스트를 해 본 결과 정확한 결과를 얻을 수 없었기 때문이다.

인코딩
파일 내용
juniversalchardet 감지 결과
결과
UTF-8(BOM)
영문+한글
Detected encoding = UTF-8
정확
UTF-8(NO_BOM)
영문+한글
Detected encoding = UTF-8
정확
UTF-8(NO_BOM_ONLY_Alpha)
영문
No encoding detected.
부정확
UNICODE(BE)
영문+한글
Detected encoding = UTF-16BE
정확
UNICODE(LE)
영문+한글
Detected encoding = UTF-16LE
정확
ANSI
영문+한글
Detected encoding = WINDOWS-1252
부정확
MS949
영문+한글
Detected encoding = WINDOWS-1252
부정확


항상 인코딩을 명시하자. 

시스템 간에 전자적인 방법으로 데이터를 주고 받아야 하는 경우 반드시 사전에 인코딩을 확인하자. 모든 시스템이 UTF-8을 사용할 것 같지만, 윈도우 10도 UTF-8을 기본으로 사용하지 않는다.


참고

juniversalhardet
UTF-8 - 나무위키

댓글 쓰기

0 댓글