Daily Notebook

[Java] Properties 한글 깨짐 이슈

by 배부른코딩로그
💡 properties 파일은 대세가 아니라지만, 간단한 설정 파일을 관리할 때 쓰긴한다 : )

목표

  • 프로퍼티 파일에 저장된 한글을 읽을 수 있다.
  • 한글이 깨져서 읽어질 때, 해답을 제안하는 공간으로 활용할 수 있다.

 

🔥 프로퍼티 파일(Properties)

프로퍼티 파일은 Key-Value로 이뤄지는 파일이다.최근에는 yaml(또는 yml) 이나 json으로 대부분 사용하지만, 프로퍼티 파일도 자주 사용된다.

 

 

💢 한글이 깨진다면?

간혹 한글이 포함된 프로퍼티 파일을 읽을 때, 한글이 잔인하게 깨지는 일이 자주 발생한다.

다음 텍스트처럼 이게 무엇인지 조차 알 수 없게 된다.

중계 문서 ê°œì¸ì •ë³´ 암호화 (%dê±´)

 

😵 원인

Properties 클래스의 정의를 살펴봐야 정확한 원인을 파악할 수 있다.

Oracle Java Docs에서 Properties 클래스에 load(Reader), store(Writer) 메서드를 다음과 같이 설명한다.

 

The load(Reader) / store(Writer, String) methods load and store properties from and to a character based stream in a simple line-oriented format specified below. The load(InputStream) / store(OutputStream, String) methods work the same way as the load(Reader)/store(Writer, String) pair, except the input/output stream is encoded in ISO 8859-1 character encoding. Characters that cannot be directly represented in this encoding can be written using Unicode escapes as defined in section 3.3 of The Java™ Language Specification; only a single 'u' character is allowed in an escape sequence. The native2ascii tool can be used to convert property files to and from other character encodings.

 

해석해보면, 문자 기반 스트림을 로드하고 저장하는 I/O과정에서 ISO 8859-1 문자 인코딩을 따른다고 되어있다.

이는 eclipse 혹은 intelliJ에서도 다음과 같이 정확하게 명시되어 있다.

즉, ISO 8859-1 로 읽어드린 문자열을 UTF-8 문자열로 변환해야 정상적인 한글값을 얻을 수 있다는 말이다.

 

🌟 해결방법

해결 방법이자, 예제 코드는 다음과 같다.

try {
    properties.load(new FileInputStream(resource));
    value = new String(properties.getProperty(key).getBytes("ISO-8859-1"), "utf-8");
            
} catch(IOException e) {
    e.printStackTrace();
}

 

위 코드를 통해 깨진 프로퍼티 파일을 다시 읽어보면 깨졌던 문자열이 정상적으로 출력되는 것을 확인할 수 있다.

어플 유저 개인정보 암호화 (%d건)

 

 

출처

 

Last Updated. 2022. 10. 25.

 

반응형

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기