ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UTF-8, EUC-KR 인코딩 파일 읽어들이기
    Java & Kotlin 2023. 9. 3. 23:45
    반응형

    1) 서론

    파일을 읽고, 쓰는 레거시 로직이 있었습니다.

     

    파일을 읽는 데에는 아무런 문제가 없었으나 정작 나가는 패킷에서는 알 수 없는 문자가 추가되어 나갔습니다. 파일을 받는 쪽에서도 대부분의 문자는 정상이었지만, 중간중간 깨지는 문자들이 존재했습니다.

     

    이러한 문제를 해결하며 확인한 것을 기록하니다.


    2) UTF-8 인코딩 파일 읽어들이기

    // 생성된 파일 읽기
    $ cat test-encoding-utf8.txt
    안녕하세요. 저는 현재 테스트 중 입니다.
    
    
    // 파일 인코딩 확인
    $file -I test-encoding-utf8.txt
    test-encoding-utf8.txt: text/plain; charset=utf-8
    • UTF-8 인코딩 된 텍스트 파일이 존재합니다

    • FileReader 사용하여 UTF-8 인코딩 된 파일을 읽어 들입니다
    • 출력한 내용이 파일의 내용과 일치하는지 확인합니다

    • 테스트 성공합니다
    • 읽어 들인 내용이 파일의 내용과 동일합니다

    3) EUC-KR 인코딩 파일 읽어 들이기

    // 생성된 파일 인코딩 -> euc-kr로 변경
    iconv -f utf-8 -t euckr test-encoding-utf8.txt > test-encoding-euckr.txt
    
    
    // 인코딩 확인
    $ file -I test-encoding-euckr.txt
    test-encoding-euckr.txt: text/plain; charset=iso-8859-1

    • 파일을 읽어 들이지 못하는 것에 대한 테스트 성공입니다
    • 읽어 들인 파일 내용은 모두 깨져서 보입니다

    EUC-KR 파일은 왜 깨져서 보이는 걸까요? 있는 그대로 파일을 읽을 수는 없는 것일까요?

    3. 1) EUC-KR 파일은 왜 읽어 들일 수 없을까요?

    자바에서 지원하는 파일을 읽는 라이브러리는 기본적으로 JVM 인코딩 설정을 따릅니다.

    JDK 기본 인코딩 설정은 UTF-8인데요. JDK에 포함되어 있는 JVM은 당연히 JDK의 기본 인코딩 설정을 따릅니다. 

    Prior to deploying on a JDK where UTF-8 is the default charset, developers are strongly encouraged to check for charset issues by starting the Java runtime with java -Dfile.encoding=UTF-8 ... on their current JDK (8-17).
    • oracle 공식 문서 중

    • 기본 character set은 UTF-8입니다.
    • UTF-8 문자를 사용하기 위해서, 인코딩도 당연히 UTF-8이어야 합니다

     

    위의 테스트에서는 EUC-KR 인코딩 된 파일을 UTF-8 인코딩으로 읽었기 때문에 당연히 읽을 수 없습니다.

    3. 2) KSC5601

    만약 EUC-KR이 아닌, KSC5601 방식을 사용하면 어떻게 될까요?

    • KSC5601 방식을 사용하여 읽었지만 테스트 통과합니다

     

    EUC-KR은 사실 KSC5601(한글) + KSC5636(영문) 방식으로 이루어져 있습니다. 그러므로 KSC5601 방식으로 읽어 들이는 것도 가능합니다.

     

    하지만 모든 파일이 한글만 사용되지는 않을 것입니다. 그렇기 때문에 좀 더 범용적인 EUC-KR을 사용하는 것이 더 좋다고 생각합니다.

    4) 진짜 EUC-KR 인코딩 파일 읽어 들이기

    사실 해결 방법은 간단합니다.

    • FileReader를 이용하여 파일을 읽을 때 인코딩을 설정합니다 (자바 11 ~)
    • 자바 8의 경우 FileInputStream를 이용하여 인코딩 설정을 하면 됩니다

    • 테스트는 정상적으로 수행합니다

    5) 결론

    사실 요즈음 대부분의 파일과 입출력 시스템은 UTF-8 표준을 따르고 있습니다. 이 때문에 보통의 경우에는 인코딩 문제를 만날 일이 거의 없습니다.

     

    하지만 간혹 레거시 혹은 금융 시스템을 다룰 때에는 EUC-KR 혹은 KSC5601로만 인코딩 된 파일과 입출력 시스템을 만날 때가 있습니다. 그리고 이러한 인코딩 방식이 모든 글자를 깨지게 하는 것도 아닙니다. 사소한 문제이지만 특정 문자만 깨지거나, 인코딩 방식이 아주 깊은 곳에 코드로서 존재한다면 원인을 파악하는 것이 쉽지 않습니다.

     

    하지만 JDK와 라이브러리들의 기본 인코딩 방식을 알고 있다면, 이러한 문제의 원인에 다가가는 것이 조금 더 빠를 수 있을 것 같습니다.


    6) 참고 문헌

    반응형

    댓글

Designed by Tistory.